# HG changeset patch # User tbell # Date 1233854685 28800 # Node ID 34c52e8a097bbc816d52394a46476a62d3647366 # Parent d3de53b2070d2aa73436d5526a3ae0181da3f640# Parent 04b2620edc72de93671646e4720c5992c74ac8b5 Merge diff -r d3de53b2070d -r 34c52e8a097b .hgtags --- a/.hgtags Fri Jan 30 23:27:20 2009 -0800 +++ b/.hgtags Thu Feb 05 09:24:45 2009 -0800 @@ -19,3 +19,4 @@ caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42 41bd0a702bc8ec6feebd725a63e7c3227f82ab11 jdk7-b43 5843778bda89b1d5ac8e1aa05e26930ac90b3145 jdk7-b44 +54dffad0bf066791a2793305875250c395011d5f jdk7-b45 diff -r d3de53b2070d -r 34c52e8a097b .hgtags-top-repo --- a/.hgtags-top-repo Fri Jan 30 23:27:20 2009 -0800 +++ b/.hgtags-top-repo Thu Feb 05 09:24:45 2009 -0800 @@ -19,3 +19,4 @@ 94052b87287303527125026fe4b2698cf867ea83 jdk7-b42 848e684279d2ba42577d9621d5b2e5af3823d12d jdk7-b43 a395e3aac4744cc9033fcd819fad1239a45add52 jdk7-b44 +99846f001ca214015578d593802d26e27246a802 jdk7-b45 diff -r d3de53b2070d -r 34c52e8a097b corba/.hgtags --- a/corba/.hgtags Fri Jan 30 23:27:20 2009 -0800 +++ b/corba/.hgtags Thu Feb 05 09:24:45 2009 -0800 @@ -19,3 +19,4 @@ ccd6a16502e0650d91d85c4b86be05cbcd461a87 jdk7-b42 9cd740d48a4855321d69f137a7109c00bcda76be jdk7-b43 9803dac7254041b30ca65e3852d4c566b9757c3b jdk7-b44 +68814aa5b44b1f16931a97e7cd4028c70eb9586b jdk7-b45 diff -r d3de53b2070d -r 34c52e8a097b hotspot/.hgtags --- a/hotspot/.hgtags Fri Jan 30 23:27:20 2009 -0800 +++ b/hotspot/.hgtags Thu Feb 05 09:24:45 2009 -0800 @@ -19,3 +19,4 @@ ad8c8ca4ab0f4c86e74c061958f44a8f4a930f2c jdk7-b42 fc6a5ae3fef5ebacfa896dbb3ae37715e388e282 jdk7-b43 809e899c638bd9b21836abf9d09ab2a30ff3900b jdk7-b44 +945bf754069766e76873c53102fae48abf04cf5b jdk7-b45 diff -r d3de53b2070d -r 34c52e8a097b jaxp/.hgtags --- a/jaxp/.hgtags Fri Jan 30 23:27:20 2009 -0800 +++ b/jaxp/.hgtags Thu Feb 05 09:24:45 2009 -0800 @@ -19,3 +19,4 @@ 036e0dca841a5a17f784d15c86a9da88d2a6f1e6 jdk7-b42 96fe28d4a9131e1a97bfe00f779e5626cd09c4d0 jdk7-b43 b203df0741af3eb08687bc5eb798bac87363758d jdk7-b44 +0f113667880d335cfa2c35721b1b45144fb757f5 jdk7-b45 diff -r d3de53b2070d -r 34c52e8a097b jaxws/.hgtags --- a/jaxws/.hgtags Fri Jan 30 23:27:20 2009 -0800 +++ b/jaxws/.hgtags Thu Feb 05 09:24:45 2009 -0800 @@ -19,3 +19,4 @@ 621c02d83abc850c170fb6726d57b19f1eaf5033 jdk7-b42 1ad2f51564db6ca4c6d95760cf13fb083d3dec94 jdk7-b43 344485a03674b6950a7a23d01a6efb8055afb6ec jdk7-b44 +dea7753d713936c5b6fd942a91811b0676537fd0 jdk7-b45 diff -r d3de53b2070d -r 34c52e8a097b jdk/make/common/Release.gmk --- a/jdk/make/common/Release.gmk Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/common/Release.gmk Thu Feb 05 09:24:45 2009 -0800 @@ -912,14 +912,6 @@ done ifeq ($(PLATFORM), windows) @# - @# Audio soundbank - Bug# 4236400 - @# Windows only: adding audio files to JDK's jre/lib directory. - @# - ($(CD) $(LIBDIR) && $(TAR) cf - \ - `$(FIND) audio -depth -print`) | \ - ($(CD) $(JDK_IMAGE_DIR)/jre/lib && $(TAR) xf -) - @# - @# @# lib/ @# $(CP) $(LIBDIR)/$(LIB_PREFIX)jvm.$(LIB_SUFFIX) $(JDK_IMAGE_DIR)/lib diff -r d3de53b2070d -r 34c52e8a097b jdk/make/common/internal/BinaryPlugs.gmk --- a/jdk/make/common/internal/BinaryPlugs.gmk Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/common/internal/BinaryPlugs.gmk Thu Feb 05 09:24:45 2009 -0800 @@ -29,9 +29,7 @@ # Names of native shared libraries -PLUG_JSOUND_LIBRARY=$(LIB_PREFIX)jsoundhs.$(LIBRARY_SUFFIX) -PLUG_LIBRARY_NAMES = \ - $(PLUG_JSOUND_LIBRARY) +PLUG_LIBRARY_NAMES= # Sub-directory where native shared libraries are located (e.g. jre/bin or...) @@ -74,62 +72,10 @@ com/sun/jmx/snmp/daemon/SnmpTimerServer.class \ com/sun/jmx/snmp/daemon/WaitQ.class -PLUG_SOUND_CLASS_NAMES = \ -com/sun/media/sound/AbstractPlayer.class \ -com/sun/media/sound/CircularBuffer.class \ -com/sun/media/sound/HeadspaceInstrument.class \ -com/sun/media/sound/HeadspaceMixer\$$1.class \ -com/sun/media/sound/HeadspaceMixer\$$MidiLine.class \ -com/sun/media/sound/HeadspaceMixer\$$MidiLineInfo.class \ -com/sun/media/sound/HeadspaceMixer\$$MixerInfo.class \ -com/sun/media/sound/HeadspaceMixer\$$MixerReverbControl\$$MixerReverbType.class \ -com/sun/media/sound/HeadspaceMixer\$$MixerReverbControl.class \ -com/sun/media/sound/HeadspaceMixer.class \ -com/sun/media/sound/HeadspaceMixerProvider.class \ -com/sun/media/sound/HeadspaceSample.class \ -com/sun/media/sound/HeadspaceSoundbank.class \ -com/sun/media/sound/HsbParser.class \ -com/sun/media/sound/MixerClip\$$1.class \ -com/sun/media/sound/MixerClip\$$MixerClipApplyReverbControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipGainControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipMuteControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipPanControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipSampleRateControl.class \ -com/sun/media/sound/MixerClip.class \ -com/sun/media/sound/MixerMidiChannel.class \ -com/sun/media/sound/MixerSequencer\$$1.class \ -com/sun/media/sound/MixerSequencer\$$ControllerVectorElement.class \ -com/sun/media/sound/MixerSequencer\$$MixerSequencerInfo.class \ -com/sun/media/sound/MixerSequencer\$$RecordingTrack.class \ -com/sun/media/sound/MixerSequencer.class \ -com/sun/media/sound/MixerSequencerProvider.class \ -com/sun/media/sound/MixerSourceLine\$$1.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineApplyReverbControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineGainControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineMuteControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLinePanControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineSampleRateControl.class \ -com/sun/media/sound/MixerSourceLine.class \ -com/sun/media/sound/MixerSynth\$$1.class \ -com/sun/media/sound/MixerSynth\$$MixerSynthInfo.class \ -com/sun/media/sound/MixerSynth\$$SynthReceiver.class \ -com/sun/media/sound/MixerSynth.class \ -com/sun/media/sound/MixerSynthProvider.class \ -com/sun/media/sound/MixerThread.class \ -com/sun/media/sound/RmfFileReader.class \ -com/sun/media/sound/SimpleInputDevice\$$1.class \ -com/sun/media/sound/SimpleInputDevice\$$InputDeviceDataLine.class \ -com/sun/media/sound/SimpleInputDevice\$$InputDevicePort.class \ -com/sun/media/sound/SimpleInputDevice\$$InputDevicePortInfo.class \ -com/sun/media/sound/SimpleInputDevice.class \ -com/sun/media/sound/SimpleInputDeviceProvider\$$1.class \ -com/sun/media/sound/SimpleInputDeviceProvider\$$InputDeviceInfo.class \ -com/sun/media/sound/SimpleInputDeviceProvider.class - # Class list temp files (used by both import and export of plugs) PLUG_TEMPDIR=$(ABS_TEMPDIR)/plugs -PLUG_CLASS_AREAS = jmf sound +PLUG_CLASS_AREAS = jmf PLUG_CLISTS = $(PLUG_CLASS_AREAS:%=$(PLUG_TEMPDIR)/%.clist) # Create jargs file command @@ -147,18 +93,11 @@ @for i in $(PLUG_JMF_CLASS_NAMES) ; do \ $(ECHO) "$$i" >> $@; \ done -$(PLUG_TEMPDIR)/sound.clist: - @$(prep-target) - @for i in $(PLUG_SOUND_CLASS_NAMES) ; do \ - $(ECHO) "$$i" >> $@ ; \ - done $(PLUG_TEMPDIR)/all.clist: $(PLUG_CLISTS) @$(prep-target) $(CAT) $(PLUG_CLISTS) > $@ $(PLUG_TEMPDIR)/jmf.jargs: $(PLUG_TEMPDIR)/jmf.clist $(plug-create-jargs) -$(PLUG_TEMPDIR)/sound.jargs: $(PLUG_TEMPDIR)/sound.clist - $(plug-create-jargs) $(PLUG_TEMPDIR)/all.jargs: $(PLUG_TEMPDIR)/all.clist $(plug-create-jargs) @@ -193,25 +132,11 @@ import-binary-plug-jmf-classes: $(PLUG_IMPORT_JARFILE) $(PLUG_TEMPDIR)/jmf.clist $(call import-binary-plug-classes,$(PLUG_TEMPDIR)/jmf.clist) -import-binary-plug-sound-classes: $(PLUG_IMPORT_JARFILE) $(PLUG_TEMPDIR)/sound.clist - $(call import-binary-plug-classes,$(PLUG_TEMPDIR)/sound.clist) # Import all classes from the jar file import-binary-plug-jar: \ - import-binary-plug-jmf-classes \ - import-binary-plug-sound-classes - -# Import native libraries - -$(LIB_LOCATION)/$(PLUG_JSOUND_LIBRARY): \ - $(PLUG_IMPORT_DIR)/$(PLUG_LOCATION_SUBDIR)/$(PLUG_JSOUND_LIBRARY) - $(import-binary-plug-file) - -# Rules only used by lower level makefiles - -import-binary-plug-jsound-library: \ - $(LIB_LOCATION)/$(PLUG_JSOUND_LIBRARY) + import-binary-plug-jmf-classes # Binary plug start/complete messages @@ -241,9 +166,7 @@ import-binary-plugs-libs \ import-binary-plugs \ import-binary-plug-jar \ - import-binary-plug-jmf-classes \ - import-binary-plug-sound-classes \ - import-binary-plug-jsound-library + import-binary-plug-jmf-classes else # !OPENJDK @@ -280,12 +203,6 @@ @$(java-vm-cleanup) export-binary-plugs-jar: $(PLUG_EXPORT_JARFILE) -# Export native libraries - -$(PLUG_EXPORT_DIR)/$(PLUG_LOCATION_SUBDIR)/$(PLUG_JSOUND_LIBRARY): \ - $(LIB_LOCATION)/$(PLUG_JSOUND_LIBRARY) - $(export-binary-plug-file) - # Export binary plug start/complete messages export-binary-plugs-started: diff -r d3de53b2070d -r 34c52e8a097b jdk/make/javax/sound/Makefile --- a/jdk/make/javax/sound/Makefile Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/javax/sound/Makefile Thu Feb 05 09:24:45 2009 -0800 @@ -54,18 +54,6 @@ AUTO_FILES_JAVA_DIRS = javax/sound com/sun/media/sound # -# Specific to OpenJDK building -# -ifdef OPENJDK - -# copy closed .class files -build: import-binary-plug-sound-classes - -include $(BUILDDIR)/common/internal/BinaryPlugs.gmk - -endif # OPENJDK - -# # Files that just need cp. # SERVICEDIR = $(CLASSBINDIR)/META-INF/services @@ -79,13 +67,11 @@ $(SERVICEDIR)/javax.sound.sampled.spi.AudioFileReader \ $(SERVICEDIR)/javax.sound.sampled.spi.FormatConversionProvider \ $(SERVICEDIR)/javax.sound.sampled.spi.MixerProvider \ - $(LIBDIR)/audio/soundbank.gm \ $(LIBDIR)/sound.properties FILES_mkdirs = \ $(CLASSBINDIR)/META-INF \ - $(CLASSBINDIR)/META-INF/services \ - $(LIBDIR)/audio + $(CLASSBINDIR)/META-INF/services FILES_copydirs = \ $(CLASSBINDIR) \ @@ -96,11 +82,6 @@ # -# add "closed" library -# -SUBDIRS += jsoundhs - -# # system dependent flags # ifeq ($(PLATFORM), windows) diff -r d3de53b2070d -r 34c52e8a097b jdk/make/javax/sound/jsoundhs/FILES.gmk --- a/jdk/make/javax/sound/jsoundhs/FILES.gmk Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -# -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# This code 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 -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -# CA 95054 USA or visit www.sun.com if you need additional information or -# have any questions. -# - -FILES_c = \ - Utilities.c \ - MixerThread.c \ - HeadspaceMixer.c \ - MixerClip.c \ - MixerSourceLine.c \ - SimpleInputDevice.c \ - SimpleInputDeviceProvider.c \ - HeadspaceSoundbank.c \ - MixerMidiChannel.c \ - AbstractPlayer.c \ - MixerSequencer.c \ - MixerSynth.c - -FILES_engine = \ - DriverTools.c \ - GenAudioCaptureStreams.c \ - GenAudioStreams.c \ - GenOutput.c \ - GenPatch.c \ - GenReverb.c \ - GenSample.c \ - GenSeq.c \ - GenSetup.c \ - GenSong.c \ - GenSynth.c \ - GenSynthFilters.c \ - GenSynthInterp2.c \ - GenSynthResample.c \ - NewNewLZSS.c \ - SampleTools.c \ - SMOD_Volume_Scaler.c \ - X_API.c \ - X_Decompress.c \ - X_IMA.c \ - GenFiltersReverb.c \ - GenInterp2Reverb.c \ - GenSoundFiles.c \ - SincResample.c - -FILES_solaris = \ - HAE_API_SolarisOS.c \ - HAE_API_SolarisOS_Capture.c - -FILES_linux = \ - HAE_API_LinuxOS.c \ - HAE_API_LinuxOS_Capture.c - -FILES_windows = \ - HAE_API_WinOS.c \ - HAE_API_WinOS_Capture.c \ - HAE_API_WinOS_Synth.c - -FILES_export = \ - com/sun/media/sound/AbstractPlayer.java \ - com/sun/media/sound/HeadspaceMixer.java \ - com/sun/media/sound/HeadspaceSoundbank.java \ - com/sun/media/sound/MixerClip.java \ - com/sun/media/sound/MixerMidiChannel.java \ - com/sun/media/sound/MixerSequencer.java \ - com/sun/media/sound/MixerSourceLine.java \ - com/sun/media/sound/MixerSynth.java \ - com/sun/media/sound/MixerThread.java \ - com/sun/media/sound/SimpleInputDevice.java \ - com/sun/media/sound/SimpleInputDeviceProvider.java - diff -r d3de53b2070d -r 34c52e8a097b jdk/make/javax/sound/jsoundhs/Makefile --- a/jdk/make/javax/sound/jsoundhs/Makefile Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -# -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# This code 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 -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -# CA 95054 USA or visit www.sun.com if you need additional information or -# have any questions. -# - -BUILDDIR = ../../.. -PACKAGE = javax.sound -LIBRARY = jsoundhs -PRODUCT = sun -CPLUSPLUSLIBRARY = true -include $(BUILDDIR)/common/Defs.gmk - -# this Makefile compiles "closed" JavaSound library - -ifdef OPENJDK - -# precompiled lib will be copied by the rules in Library.gmk instead of compiling. -USE_BINARY_PLUG_LIBRARY=true - -build: import-binary-plug-jsound-library - -include $(BUILDDIR)/common/internal/BinaryPlugs.gmk - -else # OPENJDK - -# include defines for sound -include ../SoundDefs.gmk - -# -# Add use of mapfile -# -FILES_m = mapfile-vers -include $(BUILDDIR)/common/Mapfile-vers.gmk - -# -# Files -# -include FILES.gmk - -FILES_c += $(FILES_engine) $(FILES_$(PLATFORM)) - -# -# Extra cc/linker flags. -# -# flags needed for all platforms -CPPFLAGS += \ - -DJAVA_SOUND -DJAVA_THREAD \ - -I$(CLOSED_SHARE_SRC)/native/com/sun/media/sound \ - -I$(CLOSED_SHARE_SRC)/native/com/sun/media/sound/engine - -# system dependent flags -ifeq ($(PLATFORM), windows) - CPPFLAGS += -DUSE_DIRECTSOUND=0 \ - -DUSE_EXTERNAL_SYNTH=TRUE - LDLIBS += winmm.lib -endif # PLATFORM windows - -ifeq ($(PLATFORM), linux) -endif # PLATFORM linux - -ifeq ($(PLATFORM), solaris) -endif # PLATFORM solaris - - -# -# Add to the ambient VPATH. -# -vpath %.c $(CLOSED_SHARE_SRC)/native/com/sun/media/sound -vpath %.c $(CLOSED_SHARE_SRC)/native/com/sun/media/sound/engine -vpath %.c $(CLOSED_PLATFORM_SRC)/native/com/sun/media/sound/engine - - -endif # OPENJDK - - -# -# Include rules -# -include $(BUILDDIR)/common/Library.gmk - diff -r d3de53b2070d -r 34c52e8a097b jdk/make/javax/sound/jsoundhs/mapfile-vers --- a/jdk/make/javax/sound/jsoundhs/mapfile-vers Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ -# -# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# This code 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 -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -# CA 95054 USA or visit www.sun.com if you need additional information or -# have any questions. -# - -# Define library interface. - -SUNWprivate_1.1 { - global: - Java_com_sun_media_sound_AbstractPlayer_nAddReceiver; - Java_com_sun_media_sound_AbstractPlayer_nClose; - Java_com_sun_media_sound_AbstractPlayer_nLoadInstrument; - Java_com_sun_media_sound_AbstractPlayer_nRemapInstrument; - Java_com_sun_media_sound_AbstractPlayer_nRemoveReceiver; - Java_com_sun_media_sound_AbstractPlayer_nUnloadInstrument; - Java_com_sun_media_sound_HeadspaceMixer_nAllocateVoices; - Java_com_sun_media_sound_HeadspaceMixer_nCloseMixer; - Java_com_sun_media_sound_HeadspaceMixer_nCreateLinkedStreams; - Java_com_sun_media_sound_HeadspaceMixer_nDrain; - Java_com_sun_media_sound_HeadspaceMixer_nFlush; - Java_com_sun_media_sound_HeadspaceMixer_nGetCpuLoad; - Java_com_sun_media_sound_HeadspaceMixer_nGetDefaultBufferSize; - Java_com_sun_media_sound_HeadspaceMixer_nGetLevel; - Java_com_sun_media_sound_HeadspaceMixer_nGetPosition; - Java_com_sun_media_sound_HeadspaceMixer_nGetTotalVoices; - Java_com_sun_media_sound_HeadspaceMixer_nOpenMixer; - Java_com_sun_media_sound_HeadspaceMixer_nPause; - Java_com_sun_media_sound_HeadspaceMixer_nResume; - Java_com_sun_media_sound_HeadspaceMixer_nSetInterpolation; - Java_com_sun_media_sound_HeadspaceMixer_nSetMixerFormat; - Java_com_sun_media_sound_HeadspaceMixer_nSetMixLevel; - Java_com_sun_media_sound_HeadspaceMixer_nSetReverb; - Java_com_sun_media_sound_HeadspaceMixer_nStartLinkedStreams; - Java_com_sun_media_sound_HeadspaceMixer_nStopLinkedStreams; - Java_com_sun_media_sound_HeadspaceSoundbank_nCloseResource; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetInstruments; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetName; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetSamples; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetVersionMajor; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetVersionMinor; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetVersionSubMinor; - Java_com_sun_media_sound_HeadspaceSoundbank_nOpenResource; - Java_com_sun_media_sound_HeadspaceSoundbank_nOpenResourceFromByteArray; - Java_com_sun_media_sound_MixerClip_nClose; - Java_com_sun_media_sound_MixerClip_nDrain; - Java_com_sun_media_sound_MixerClip_nFlush; - Java_com_sun_media_sound_MixerClip_nGetPosition; - Java_com_sun_media_sound_MixerClip_nOpen; - Java_com_sun_media_sound_MixerClip_nSetLinearGain; - Java_com_sun_media_sound_MixerClip_nSetPan; - Java_com_sun_media_sound_MixerClip_nSetSampleRate; - Java_com_sun_media_sound_MixerClip_nSetup; - Java_com_sun_media_sound_MixerClip_nStart; - Java_com_sun_media_sound_MixerClip_nStop; - Java_com_sun_media_sound_MixerMidiChannel_nAllNotesOff; - Java_com_sun_media_sound_MixerMidiChannel_nControlChange; - Java_com_sun_media_sound_MixerMidiChannel_nGetController; - Java_com_sun_media_sound_MixerMidiChannel_nGetPitchBend; - Java_com_sun_media_sound_MixerMidiChannel_nGetSolo; - Java_com_sun_media_sound_MixerMidiChannel_nNoteOff; - Java_com_sun_media_sound_MixerMidiChannel_nNoteOn; - Java_com_sun_media_sound_MixerMidiChannel_nProgramChange__JIIIJ; - Java_com_sun_media_sound_MixerMidiChannel_nProgramChange__JIIJ; - Java_com_sun_media_sound_MixerMidiChannel_nResetAllControllers; - Java_com_sun_media_sound_MixerMidiChannel_nSetMute; - Java_com_sun_media_sound_MixerMidiChannel_nSetPitchBend; - Java_com_sun_media_sound_MixerMidiChannel_nSetSolo; - Java_com_sun_media_sound_MixerSequencer_nAddControllerEventCallback; - Java_com_sun_media_sound_MixerSequencer_nGetMasterTempo; - Java_com_sun_media_sound_MixerSequencer_nGetSequenceMicrosecondLength; - Java_com_sun_media_sound_MixerSequencer_nGetSequencerMicrosecondPosition; - Java_com_sun_media_sound_MixerSequencer_nGetSequencerTickPosition; - Java_com_sun_media_sound_MixerSequencer_nGetSequenceTickLength; - Java_com_sun_media_sound_MixerSequencer_nGetTempoInBPM; - Java_com_sun_media_sound_MixerSequencer_nGetTempoInMPQ; - Java_com_sun_media_sound_MixerSequencer_nGetTrackMute; - Java_com_sun_media_sound_MixerSequencer_nGetTrackSolo; - Java_com_sun_media_sound_MixerSequencer_nOpenMidiSequencer; - Java_com_sun_media_sound_MixerSequencer_nOpenRmfSequencer; - Java_com_sun_media_sound_MixerSequencer_nPauseSequencer; - Java_com_sun_media_sound_MixerSequencer_nResumeSequencer; - Java_com_sun_media_sound_MixerSequencer_nSetMasterTempo; - Java_com_sun_media_sound_MixerSequencer_nSetSequencerMicrosecondPosition; - Java_com_sun_media_sound_MixerSequencer_nSetSequencerTickPosition; - Java_com_sun_media_sound_MixerSequencer_nSetTempoInBPM; - Java_com_sun_media_sound_MixerSequencer_nSetTempoInMPQ; - Java_com_sun_media_sound_MixerSequencer_nSetTrackMute; - Java_com_sun_media_sound_MixerSequencer_nSetTrackSolo; - Java_com_sun_media_sound_MixerSequencer_nStartSequencer; - Java_com_sun_media_sound_MixerSourceLine_nClose; - Java_com_sun_media_sound_MixerSourceLine_nDrain; - Java_com_sun_media_sound_MixerSourceLine_nFlush; - Java_com_sun_media_sound_MixerSourceLine_nGetLevel; - Java_com_sun_media_sound_MixerSourceLine_nGetPosition; - Java_com_sun_media_sound_MixerSourceLine_nOpen; - Java_com_sun_media_sound_MixerSourceLine_nPause; - Java_com_sun_media_sound_MixerSourceLine_nResume; - Java_com_sun_media_sound_MixerSourceLine_nSetLinearGain; - Java_com_sun_media_sound_MixerSourceLine_nSetPan; - Java_com_sun_media_sound_MixerSourceLine_nSetSampleRate; - Java_com_sun_media_sound_MixerSourceLine_nStart; - Java_com_sun_media_sound_MixerSynth_nCreateSynthesizer; - Java_com_sun_media_sound_MixerSynth_nDestroySynthesizer; - Java_com_sun_media_sound_MixerSynth_nGetLatency; - Java_com_sun_media_sound_MixerSynth_nLoadInstrument; - Java_com_sun_media_sound_MixerSynth_nRemapInstrument; - Java_com_sun_media_sound_MixerSynth_nStartSynthesizer; - Java_com_sun_media_sound_MixerSynth_nUnloadInstrument; - Java_com_sun_media_sound_MixerThread_runNative; - Java_com_sun_media_sound_SimpleInputDevice_nClose; - Java_com_sun_media_sound_SimpleInputDevice_nDrain; - Java_com_sun_media_sound_SimpleInputDevice_nFlush; - Java_com_sun_media_sound_SimpleInputDevice_nGetBufferSizeInFrames; - Java_com_sun_media_sound_SimpleInputDevice_nGetFormats; - Java_com_sun_media_sound_SimpleInputDevice_nGetNumPorts; - Java_com_sun_media_sound_SimpleInputDevice_nGetPortName; - Java_com_sun_media_sound_SimpleInputDevice_nGetPosition; - Java_com_sun_media_sound_SimpleInputDevice_nOpen; - Java_com_sun_media_sound_SimpleInputDevice_nPause; - Java_com_sun_media_sound_SimpleInputDevice_nResume; - Java_com_sun_media_sound_SimpleInputDevice_nStart; - Java_com_sun_media_sound_SimpleInputDevice_nStop; - Java_com_sun_media_sound_SimpleInputDevice_nSupportsChannels; - Java_com_sun_media_sound_SimpleInputDevice_nSupportsSampleRate; - Java_com_sun_media_sound_SimpleInputDevice_nSupportsSampleSizeInBits; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetDescription; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetName; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetNumDevices; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetVendor; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetVersion; - local: - *; -}; diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/VERSION --- a/jdk/make/sun/javazic/tzdata/VERSION Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/VERSION Thu Feb 05 09:24:45 2009 -0800 @@ -21,4 +21,4 @@ # CA 95054 USA or visit www.sun.com if you need additional information or # have any questions. # -tzdata2008e +tzdata2009a diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/africa --- a/jdk/make/sun/javazic/tzdata/africa Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/africa Thu Feb 05 09:24:45 2009 -0800 @@ -458,11 +458,36 @@ # http://www.worldtimezone.com/dst_news/dst_news_mauritius02.html # +# From Riad M. Hossen Ally (2008-08-03): +# The Government of Mauritius weblink +# +# http://www.gov.mu/portal/site/pmosite/menuitem.4ca0efdee47462e7440a600248a521ca/?content_id=3D4728ca68b2a5b110VgnVCM1000000a04a8c0RCRD +# +# Cabinet Decision of July 18th, 2008 states as follows: +# +# 4. ...Cabinet has agreed to the introduction into the National Assembly +# of the Time Bill which provides for the introduction of summer time in +# Mauritius. The summer time period which will be of one hour ahead of +# the standard time, will be aligned with that in Europe and the United +# States of America. It will start at two o'clock in the morning on the +# last Sunday of October and will end at two o'clock in the morning on +# the last Sunday of March the following year. The summer time for the +# year 2008 - 2009 will, therefore, be effective as from 26 October 2008 +# and end on 29 March 2009. + +# From Ed Maste (2008-10-07): +# THE TIME BILL (No. XXVII of 2008) Explanatory Memorandum states the +# beginning / ending of summer time is 2 o'clock standard time in the +# morning of the last Sunday of October / last Sunday of March. +# +# http://www.gov.mu/portal/goc/assemblysite/file/bill2708.pdf +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Mauritius 1982 only - Oct 10 0:00 1:00 S Rule Mauritius 1983 only - Mar 21 0:00 0 - -Rule Mauritius 2008 only - Oct 26 2:00s 1:00 S -Rule Mauritius 2009 only - Mar 27 2:00s 0 - +Rule Mauritius 2008 max - Oct lastSun 2:00s 1:00 S +Rule Mauritius 2009 max - Mar lastSun 2:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis 4:00 Mauritius MU%sT # Mauritius Time @@ -547,7 +572,22 @@ # From Arthur David Olson (2008-05-09): # XXX--guess that it is only Morocco for now; guess only 2008 for now. +# From Steffen Thorsen (2008-08-27): +# Morocco will change the clocks back on the midnight between August 31 +# and September 1. They originally planned to observe DST to near the end +# of September: +# +# One article about it (in French): +# +# http://www.menara.ma/fr/Actualites/Maroc/Societe/ci.retour_a_l_heure_gmt_a_partir_du_dimanche_31_aout_a_minuit_officiel_.default +# +# +# We have some further details posted here: +# +# http://www.timeanddate.com/news/time/morocco-ends-dst-early-2008.html +# # RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Morocco 1939 only - Sep 12 0:00 1:00 S Rule Morocco 1939 only - Nov 19 0:00 0 - Rule Morocco 1940 only - Feb 25 0:00 1:00 S @@ -564,7 +604,7 @@ Rule Morocco 1978 only - Jun 1 0:00 1:00 S Rule Morocco 1978 only - Aug 4 0:00 0 - Rule Morocco 2008 only - Jun 1 0:00 1:00 S -Rule Morocco 2008 only - Sep 28 0:00 0 - +Rule Morocco 2008 only - Sep 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26 0:00 Morocco WE%sT 1984 Mar 16 diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/asia --- a/jdk/make/sun/javazic/tzdata/asia Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/asia Thu Feb 05 09:24:45 2009 -0800 @@ -1496,7 +1496,7 @@ # Nepal # Zone NAME GMTOFF RULES FORMAT [UNTIL] -Zone Asia/Katmandu 5:41:16 - LMT 1920 +Zone Asia/Kathmandu 5:41:16 - LMT 1920 5:30 - IST 1986 5:45 - NPT # Nepal Time @@ -1563,11 +1563,24 @@ # From Arthur David Olson (2008-05-19): # XXX--midnight transitions is a guess; 2008 only is a guess. +# From Alexander Krivenyshev (2008-08-28): +# Pakistan government has decided to keep the watches one-hour advanced +# for another 2 months--plan to return to Standard Time on October 31 +# instead of August 31. +# +# +# http://www.worldtimezone.com/dst_news/dst_news_pakistan02.html +# +# OR +# +# http://dailymailnews.com/200808/28/news/dmbrn03.html +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Pakistan 2002 only - Apr Sun>=2 0:01 1:00 S Rule Pakistan 2002 only - Oct Sun>=2 0:01 0 - Rule Pakistan 2008 only - Jun 1 0:00 1:00 S -Rule Pakistan 2008 only - Sep 1 0:00 0 - +Rule Pakistan 2008 only - Nov 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Karachi 4:28:12 - LMT 1907 5:30 - IST 1942 Sep @@ -1687,6 +1700,23 @@ # For lack of better information, predict that future changes will be # the 2nd Thursday of September at 02:00. +# From Alexander Krivenyshev (2008-08-28): +# Here is an article, that Mideast running on different clocks at Ramadan. +# +# Gaza Strip (as Egypt) ended DST at midnight Thursday (Aug 28, 2008), while +# the West Bank will end Daylight Saving Time at midnight Sunday (Aug 31, 2008). +# +# +# http://www.guardian.co.uk/world/feedarticle/7759001 +# +# +# http://www.abcnews.go.com/International/wireStory?id=5676087 +# +# or +# +# http://www.worldtimezone.com/dst_news/dst_news_gazastrip01.html +# + # The rules for Egypt are stolen from the `africa' file. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule EgyptAsia 1957 only - May 10 0:00 1:00 S @@ -1702,7 +1732,8 @@ Rule Palestine 2005 only - Oct 4 2:00 0 - Rule Palestine 2006 max - Apr 1 0:00 1:00 S Rule Palestine 2006 only - Sep 22 0:00 0 - -Rule Palestine 2007 max - Sep Thu>=8 2:00 0 - +Rule Palestine 2007 only - Sep Thu>=8 2:00 0 - +Rule Palestine 2008 max - Aug lastThu 2:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Gaza 2:17:52 - LMT 1900 Oct @@ -1948,8 +1979,20 @@ # compilers can't handle or having multiple Rules (a la Israel). # For now, use "Apr Fri>=1", and go with IATA on a uniform Sep 30 end. +# From Steffen Thorsen (2008-10-07): +# Syria has now officially decided to end DST on 2008-11-01 this year, +# according to the following article in the Syrian Arab News Agency (SANA). +# +# The article is in Arabic, and seems to tell that they will go back to +# winter time on 2008-11-01 at 00:00 local daylight time (delaying/setting +# clocks back 60 minutes). +# +# +# http://sana.sy/ara/2/2008/10/07/195459.htm +# + Rule Syria 2008 max - Apr Fri>=1 0:00 1:00 S -Rule Syria 2008 max - Oct 1 0:00 0 - +Rule Syria 2008 max - Nov 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/backward --- a/jdk/make/sun/javazic/tzdata/backward Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/backward Thu Feb 05 09:24:45 2009 -0800 @@ -46,6 +46,7 @@ Link Asia/Ashgabat Asia/Ashkhabad Link Asia/Chongqing Asia/Chungking Link Asia/Dhaka Asia/Dacca +Link Asia/Kathmandu Asia/Katmandu Link Asia/Kolkata Asia/Calcutta Link Asia/Macau Asia/Macao Link Asia/Jerusalem Asia/Tel_Aviv diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/europe --- a/jdk/make/sun/javazic/tzdata/europe Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/europe Thu Feb 05 09:24:45 2009 -0800 @@ -2335,11 +2335,64 @@ # mean time in preference to apparent time -- Geneva from 1780 .... # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # From Whitman (who writes ``Midnight?''): -Rule Swiss 1940 only - Nov 2 0:00 1:00 S -Rule Swiss 1940 only - Dec 31 0:00 0 - +# Rule Swiss 1940 only - Nov 2 0:00 1:00 S +# Rule Swiss 1940 only - Dec 31 0:00 0 - # From Shanks & Pottenger: -Rule Swiss 1941 1942 - May Sun>=1 2:00 1:00 S -Rule Swiss 1941 1942 - Oct Sun>=1 0:00 0 - +# Rule Swiss 1941 1942 - May Sun>=1 2:00 1:00 S +# Rule Swiss 1941 1942 - Oct Sun>=1 0:00 0 - + +# From Alois Treindl (2008-12-17): +# I have researched the DST usage in Switzerland during the 1940ies. +# +# As I wrote in an earlier message, I suspected the current tzdata values +# to be wrong. This is now verified. +# +# I have found copies of the original ruling by the Swiss Federal +# government, in 'Eidgen[o]ssische Gesetzessammlung 1941 and 1942' (Swiss +# federal law collection)... +# +# DST began on Monday 5 May 1941, 1:00 am by shifting the clocks to 2:00 am +# DST ended on Monday 6 Oct 1941, 2:00 am by shifting the clocks to 1:00 am. +# +# DST began on Monday, 4 May 1942 at 01:00 am +# DST ended on Monday, 5 Oct 1942 at 02:00 am +# +# There was no DST in 1940, I have checked the law collection carefully. +# It is also indicated by the fact that the 1942 entry in the law +# collection points back to 1941 as a reference, but no reference to any +# other years are made. +# +# Newspaper articles I have read in the archives on 6 May 1941 reported +# about the introduction of DST (Sommerzeit in German) during the previous +# night as an absolute novelty, because this was the first time that such +# a thing had happened in Switzerland. +# +# I have also checked 1916, because one book source (Gabriel, Traite de +# l'heure dans le monde) claims that Switzerland had DST in 1916. This is +# false, no official document could be found. Probably Gabriel got misled +# by references to Germany, which introduced DST in 1916 for the first time. +# +# The tzdata rules for Switzerland must be changed to: +# Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S +# Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 - +# +# The 1940 rules must be deleted. +# +# One further detail for Switzerland, which is probably out of scope for +# most users of tzdata: +# The zone file +# Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12 +# 0:29:44 - BMT 1894 Jun #Bern Mean Time +# 1:00 Swiss CE%sT 1981 +# 1:00 EU CE%sT +# describes all of Switzerland correctly, with the exception of +# the Cantone Geneve (Geneva, Genf). Between 1848 and 1894 Geneve did not +# follow Bern Mean Time but kept its own local mean time. +# To represent this, an extra zone would be needed. + +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S +Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12 0:29:44 - BMT 1894 Jun # Bern Mean Time @@ -2375,6 +2428,27 @@ # (on a non-government server though) describing dates between 2002 and 2006: # http://www.alomaliye.com/bkk_2002_3769.htm +# From Sue Williams (2008-08-11): +# I spotted this news article about a potential change in Turkey. +# +# +# http://www.hurriyet.com.tr/english/domestic/9626174.asp?scr=1 +# + +# From Sue Williams (2008-08-20): +# This article says that around the end of March 2011, Turkey wants to +# adjust the clocks forward by 1/2 hour and stay that way permanently. +# The article indicates that this is a change in timezone offset in addition +# to stopping observance of DST. +# This proposal has not yet been approved. +# +# Read more here... +# +# Turkey to abandon daylight saving time in 2011 +# +# http://www.turkishdailynews.com.tr/article.php?enewsid=112989 +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Turkey 1916 only - May 1 0:00 1:00 S Rule Turkey 1916 only - Oct 1 0:00 0 - diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/northamerica --- a/jdk/make/sun/javazic/tzdata/northamerica Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/northamerica Thu Feb 05 09:24:45 2009 -0800 @@ -1764,9 +1764,13 @@ # The individual that answered the phone confirmed that the clocks did not # move at the end of daylight saving on October 29/2006. He also told me that # the clocks did not move this past weekend (March 11/2007).... -# -# America/Resolute should use the "Canada" Rule up to October 29/2006. -# After that it should be fixed on Eastern Standard Time until further notice. + +# From Chris Walton (2008-11-13): +# ...the residents of Resolute believe that they are changing "time zones" +# twice a year. In winter months, local time is qualified with "Eastern +# Time" which is really "Eastern Standard Time (UTC-5)". In summer +# months, local time is qualified with "Central Time" which is really +# "Central Daylight Time (UTC-5)"... # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule NT_YK 1918 only - Apr 14 2:00 1:00 D @@ -1794,11 +1798,14 @@ -6:00 Canada C%sT 2000 Oct 29 2:00 -5:00 Canada E%sT # aka Qausuittuq +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Resolute 2006 max - Nov Sun>=1 2:00 0 ES +Rule Resolute 2007 max - Mar Sun>=8 2:00 0 CD Zone America/Resolute 0 - zzz 1947 Aug 31 # Resolute founded -6:00 NT_YK C%sT 2000 Oct 29 2:00 -5:00 - EST 2001 Apr 1 3:00 -6:00 Canada C%sT 2006 Oct 29 2:00 - -5:00 - EST + -5:00 Resolute %sT # aka Kangiqiniq Zone America/Rankin_Inlet 0 - zzz 1957 # Rankin Inlet founded -6:00 NT_YK C%sT 2000 Oct 29 2:00 @@ -2302,7 +2309,7 @@ Rule Cuba 1997 only - Oct 12 0:00s 0 S Rule Cuba 1998 1999 - Mar lastSun 0:00s 1:00 D Rule Cuba 1998 2003 - Oct lastSun 0:00s 0 S -Rule Cuba 2000 2006 - Apr Sun>=1 0:00s 1:00 D +Rule Cuba 2000 2004 - Apr Sun>=1 0:00s 1:00 D Rule Cuba 2006 max - Oct lastSun 0:00s 0 S Rule Cuba 2007 only - Mar Sun>=8 0:00s 1:00 D Rule Cuba 2008 max - Mar Sun>=15 0:00s 1:00 D diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/southamerica --- a/jdk/make/sun/javazic/tzdata/southamerica Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/southamerica Thu Feb 05 09:24:45 2009 -0800 @@ -186,9 +186,58 @@ # From Paul Eggert (2007-12-22): # For dates after mid-2008, the following rules are my guesses and # are quite possibly wrong, but are more likely than no DST at all. + +# From Alexander Krivenyshev (2008-09-05): +# As per message from Carlos Alberto Fonseca Arauz (Nicaragua), +# Argentina will start DST on Sunday October 19, 2008. +# +# +# http://www.worldtimezone.com/dst_news/dst_news_argentina03.html +# +# OR +# +# http://www.impulsobaires.com.ar/nota.php?id=57832 (in spanish) +# + +# From Rodrigo Severo (2008-10-06): +# Here is some info available at a Gentoo bug related to TZ on Argentina's DST: +# ... +# ------- Comment #1 from [jmdocile] 2008-10-06 16:28 0000 ------- +# Hi, there is a problem with timezone-data-2008e and maybe with +# timezone-data-2008f +# Argentinian law [Number] 25.155 is no longer valid. +# +# http://www.infoleg.gov.ar/infolegInternet/anexos/60000-64999/60036/norma.htm +# +# The new one is law [Number] 26.350 +# +# http://www.infoleg.gov.ar/infolegInternet/anexos/135000-139999/136191/norma.htm +# +# So there is no summer time in Argentina for now. + +# From Mariano Absatz (2008-10-20): +# Decree 1693/2008 applies Law 26.350 for the summer 2008/2009 establishing DST in Argentina +# From 2008-10-19 until 2009-03-15 +# +# http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=16102008&pi=3&pf=4&s=0&sec=01 +# +# +# Decree 1705/2008 excepting 12 Provinces from applying DST in the summer 2008/2009: +# Catamarca, La Rioja, Mendoza, Salta, San Juan, San Luis, La Pampa, Neuquen, Rio Negro, Chubut, Santa Cruz +# and Tierra del Fuego +# +# http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=17102008&pi=1&pf=1&s=0&sec=01 +# +# +# Press release 235 dated Saturday October 18th, from the Government of the Province of Jujuy saying +# it will not apply DST either (even when it was not included in Decree 1705/2008) +# +# http://www.jujuy.gov.ar/index2/partes_prensa/18_10_08/235-181008.doc +# + Rule Arg 2007 only - Dec 30 0:00 1:00 S Rule Arg 2008 max - Mar Sun>=15 0:00 0 - -Rule Arg 2008 max - Oct Sun>=1 0:00 1:00 S +Rule Arg 2008 max - Oct Sun>=15 0:00 1:00 S # From Mariano Absatz (2004-05-21): # Today it was officially published that the Province of Mendoza is changing @@ -336,9 +385,8 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 Arg AR%sT # -# Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC), -# Formosa (FM), Salta (SA), Santiago del Estero (SE), Cordoba (CB), -# La Pampa (LP), Neuquen (NQ), Rio Negro (RN) +# Cordoba (CB), Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), +# Chaco (CC), Formosa (FM), Santiago del Estero (SE) # # Shanks & Pottenger also make the following claims, which we haven't verified: # - Formosa switched to -3:00 on 1991-01-07. @@ -357,6 +405,18 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 Arg AR%sT # +# Salta (SA), La Pampa (LP), Neuquen (NQ), Rio Negro (RN) +Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31 + -4:16:48 - CMT 1920 May + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1991 Mar 3 + -4:00 - WART 1991 Oct 20 + -3:00 Arg AR%sT 1999 Oct 3 + -4:00 Arg AR%sT 2000 Mar 3 + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART +# # Tucuman (TM) Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31 -4:16:48 - CMT 1920 May @@ -381,7 +441,8 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 Jun 1 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # San Juan (SJ) Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31 @@ -394,7 +455,8 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 May 31 -4:00 - WART 2004 Jul 25 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Jujuy (JY) Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31 @@ -408,7 +470,8 @@ -3:00 1:00 ARST 1992 -3:00 Arg AR%sT 1999 Oct 3 -4:00 Arg AR%sT 2000 Mar 3 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Catamarca (CT), Chubut (CH) Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31 @@ -421,7 +484,8 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 Jun 1 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Mendoza (MZ) Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31 @@ -438,7 +502,8 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 May 23 -4:00 - WART 2004 Sep 26 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # San Luis (SL) Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31 @@ -466,7 +531,8 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 Jun 1 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Tierra del Fuego, Antartida e Islas del Atlantico Sur (TF) Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31 @@ -477,7 +543,8 @@ -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 May 30 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # Aruba # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -613,6 +680,36 @@ # Decretos sobre o Horario de Verao no Brasil # . +# From Steffen Thorsen (2008-08-29): +# As announced by the government and many newspapers in Brazil late +# yesterday, Brazil will start DST on 2008-10-19 (need to change rule) and +# it will end on 2009-02-15 (current rule for Brazil is fine). Based on +# past years experience with the elections, there was a good chance that +# the start was postponed to November, but it did not happen this year. +# +# It has not yet been posted to http://pcdsh01.on.br/DecHV.html +# +# An official page about it: +# +# http://www.mme.gov.br/site/news/detail.do?newsId=16722 +# +# Note that this link does not always work directly, but must be accessed +# by going to +# +# http://www.mme.gov.br/first +# +# +# One example link that works directly: +# +# http://jornale.com.br/index.php?option=com_content&task=view&id=13530&Itemid=54 +# (Portuguese) +# +# +# We have a written a short article about it as well: +# +# http://www.timeanddate.com/news/time/brazil-dst-2008-2009.html +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # Decree 20,466 (1931-10-01) # Decree 21,896 (1932-01-10) @@ -746,12 +843,34 @@ Rule Brazil 2007 only - Feb 25 0:00 0 - # Decree 6,212 (2007-09-26), # adopted by the same states as before. -Rule Brazil 2007 max - Oct Sun>=8 0:00 1:00 S -Rule Brazil 2008 max - Feb Sun>=15 0:00 0 - +Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S +# From Frederico A. C. Neves (2008-09-10): +# Acording to this decree +# +# http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm +# +# [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the +# 3rd Feb Sunday. There is an exception on the return date when this is +# the Carnival Sunday then the return date will be the next Sunday... +Rule Brazil 2008 max - Oct Sun>=15 0:00 1:00 S +Rule Brazil 2008 2011 - Feb Sun>=15 0:00 0 - +Rule Brazil 2012 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2013 2014 - Feb Sun>=15 0:00 0 - +Rule Brazil 2015 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2016 2022 - Feb Sun>=15 0:00 0 - +Rule Brazil 2023 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2024 2025 - Feb Sun>=15 0:00 0 - +Rule Brazil 2026 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2027 2033 - Feb Sun>=15 0:00 0 - +Rule Brazil 2034 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2035 2036 - Feb Sun>=15 0:00 0 - +Rule Brazil 2037 only - Feb Sun>=22 0:00 0 - +# From Arthur David Olson (2008-09-29): +# The next is wrong in some years but is better than nothing. +Rule Brazil 2038 max - Feb Sun>=15 0:00 0 - + # The latest ruleset listed above says that the following states observe DST: # DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP. -# For dates after mid-2008, the above rules with TO="max" are guesses -# and are quite possibly wrong, but are more likely than no DST at all. # Zone NAME GMTOFF RULES FORMAT [UNTIL] # diff -r d3de53b2070d -r 34c52e8a097b jdk/make/sun/javazic/tzdata/zone.tab --- a/jdk/make/sun/javazic/tzdata/zone.tab Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/make/sun/javazic/tzdata/zone.tab Thu Feb 05 09:24:45 2009 -0800 @@ -64,14 +64,15 @@ AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) -AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF) -AR -3319-06621 America/Argentina/San_Luis San Luis (SL) +AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, MN, SE, SF) +AR -2447-06525 America/Argentina/Salta (SA, LP, NQ, RN) AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) AR -2649-06513 America/Argentina/Tucuman Tucuman (TM) AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH) AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -3319-06621 America/Argentina/San_Luis San Luis (SL) AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) AS -1416-17042 Pacific/Pago_Pago @@ -137,7 +138,7 @@ CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut -CA +744144-0944945 America/Resolute Eastern Time - Resolute, Nunavut +CA +744144-0944945 America/Resolute Eastern Standard Time - Resolute, Nunavut CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario @@ -313,9 +314,9 @@ NI +1209-08617 America/Managua NL +5222+00454 Europe/Amsterdam NO +5955+01045 Europe/Oslo -NP +2743+08519 Asia/Katmandu +NP +2743+08519 Asia/Kathmandu NR -0031+16655 Pacific/Nauru -NU -1901+16955 Pacific/Niue +NU -1901-16955 Pacific/Niue NZ -3652+17446 Pacific/Auckland most locations NZ -4357-17633 Pacific/Chatham Chatham Islands OM +2336+05835 Asia/Muscat @@ -406,13 +407,13 @@ US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County US +394606-0860929 America/Indiana/Indianapolis Eastern Time - Indiana - most locations US +384038-0873143 America/Indiana/Vincennes Eastern Time - Indiana - Daviess, Dubois, Knox & Martin Counties -US +411745-0863730 America/Indiana/Knox Eastern Time - Indiana - Starke County US +410305-0863611 America/Indiana/Winamac Eastern Time - Indiana - Pulaski County US +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County +US +382931-0871643 America/Indiana/Petersburg Eastern Time - Indiana - Pike County US +384452-0850402 America/Indiana/Vevay Eastern Time - Indiana - Switzerland County US +415100-0873900 America/Chicago Central Time US +375711-0864541 America/Indiana/Tell_City Central Time - Indiana - Perry County -US +382931-0871643 America/Indiana/Petersburg Central Time - Indiana - Pike County +US +411745-0863730 America/Indiana/Knox Central Time - Indiana - Starke County US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area) diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/ObjectHandler.java --- a/jdk/src/share/classes/com/sun/beans/ObjectHandler.java Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,479 +0,0 @@ -/* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package com.sun.beans; - -import com.sun.beans.finder.ClassFinder; - -import java.beans.*; -import java.util.*; - -import org.xml.sax.*; - -import static java.util.Locale.ENGLISH; - -/** - * WARNING: This class is an implementation detail and only meant - * for use within the core platform. You should NOT depend upon it! This - * API may change drastically between dot dot release, and it may even be - * removed. - * - * @see java.beans.XMLEncoder - * @see java.io.ObjectInputStream - * - * @since 1.4 - * - * @author Philip Milne - */ -public class ObjectHandler extends HandlerBase { - - public static Class typeNameToClass(String typeName) { - typeName = typeName.intern(); - if (typeName == "boolean") return Boolean.class; - if (typeName == "byte") return Byte.class; - if (typeName == "char") return Character.class; - if (typeName == "short") return Short.class; - if (typeName == "int") return Integer.class; - if (typeName == "long") return Long.class; - if (typeName == "float") return Float.class; - if (typeName == "double") return Double.class; - if (typeName == "void") return Void.class; - return null; - } - - public static Class typeNameToPrimitiveClass(String typeName) { - typeName = typeName.intern(); - if (typeName == "boolean") return boolean.class; - if (typeName == "byte") return byte.class; - if (typeName == "char") return char.class; - if (typeName == "short") return short.class; - if (typeName == "int") return int.class; - if (typeName == "long") return long.class; - if (typeName == "float") return float.class; - if (typeName == "double") return double.class; - if (typeName == "void") return void.class; - return null; - } - - /** - * Returns the Class object associated with - * the class or interface with the given string name, - * using the default class loader. - * - * @param name fully qualified name of the desired class - * @param cl class loader from which the class must be loaded - * @return class object representing the desired class - * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader - * - * @deprecated As of JDK version 7, replaced by - * {@link ClassFinder#resolveClass(String)}. - */ - @Deprecated - public static Class classForName(String name) throws ClassNotFoundException { - return ClassFinder.resolveClass(name); - } - - /** - * Returns the Class object associated with - * the class or interface with the given string name, - * using the given class loader. - * - * @param name fully qualified name of the desired class - * @param cl class loader from which the class must be loaded - * @return class object representing the desired class - * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader - * - * @deprecated As of JDK version 7, replaced by - * {@link ClassFinder#resolveClass(String,ClassLoader)}. - */ - @Deprecated - public static Class classForName(String name, ClassLoader cl) - throws ClassNotFoundException { - return ClassFinder.resolveClass(name, cl); - } - - private Hashtable environment; - private Vector expStack; - private StringBuffer chars; - private XMLDecoder is; - private ClassLoader ldr; - private int itemsRead = 0; - private boolean isString; - - public ObjectHandler() { - environment = new Hashtable(); - expStack = new Vector(); - chars = new StringBuffer(); - } - - public ObjectHandler(XMLDecoder is) { - this(); - this.is = is; - } - - /* loader can be null */ - public ObjectHandler(XMLDecoder is, ClassLoader loader) { - this(is); - this.ldr = loader; - } - - - public void reset() { - expStack.clear(); - chars.setLength(0); - MutableExpression e = new MutableExpression(); - e.setTarget(classForName2("java.lang.Object")); - e.setMethodName("null"); - expStack.add(e); - } - - private Object getValue(Expression exp) { - try { - return exp.getValue(); - } - catch (Exception e) { - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - return null; - } - } - - private void addArg(Object arg) { - lastExp().addArg(arg); - } - - private Object pop(Vector v) { - int last = v.size()-1; - Object result = v.get(last); - v.remove(last); - return result; - } - - private Object eval() { - return getValue(lastExp()); - } - - private MutableExpression lastExp() { - return (MutableExpression)expStack.lastElement(); - } - - public Object dequeueResult() { - Object[] results = lastExp().getArguments(); - return results[itemsRead++]; - } - - private boolean isPrimitive(String name) { - return name != "void" && typeNameToClass(name) != null; - } - - private void simulateException(String message) { - Exception e = new Exception(message); - e.fillInStackTrace(); - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - } - - private Class classForName2(String name) { - try { - return ClassFinder.resolveClass(name, this.ldr); - } - catch (ClassNotFoundException e) { - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - } - return null; - } - - private HashMap getAttributes(AttributeList attrs) { - HashMap attributes = new HashMap(); - if (attrs != null && attrs.getLength() > 0) { - for(int i = 0; i < attrs.getLength(); i++) { - attributes.put(attrs.getName(i), attrs.getValue(i)); - } - } - return attributes; - } - - public void startElement(String name, AttributeList attrs) throws SAXException { - name = name.intern(); // Xerces parser does not supply unique tag names. - if (this.isString) { - parseCharCode(name, getAttributes(attrs)); - return; - } - chars.setLength(0); - - HashMap attributes = getAttributes(attrs); - MutableExpression e = new MutableExpression(); - - // Target - String className = (String)attributes.get("class"); - if (className != null) { - e.setTarget(classForName2(className)); - } - - // Property - Object property = attributes.get("property"); - String index = (String)attributes.get("index"); - if (index != null) { - property = new Integer(index); - e.addArg(property); - } - e.setProperty(property); - - // Method - String methodName = (String)attributes.get("method"); - if (methodName == null && property == null) { - methodName = "new"; - } - e.setMethodName(methodName); - - // Tags - if (name == "string") { - e.setTarget(String.class); - e.setMethodName("new"); - this.isString = true; - } - else if (isPrimitive(name)){ - Class wrapper = typeNameToClass(name); - e.setTarget(wrapper); - e.setMethodName("new"); - parseCharCode(name, attributes); - } - else if (name == "class") { - e.setTarget(Class.class); - e.setMethodName("forName"); - } - else if (name == "null") { - // Create an arbitrary expression that has a value of null - for - // consistency. - e.setTarget(Object.class); - e.setMethodName("getSuperclass"); - e.setValue(null); - } - else if (name == "void") { - if (e.getTarget() == null) { // this check is for "void class="foo" method= ..." - e.setTarget(eval()); - } - } - else if (name == "array") { - // The class attribute means sub-type for arrays. - String subtypeName = (String)attributes.get("class"); - Class subtype = (subtypeName == null) ? Object.class : classForName2(subtypeName); - String length = (String)attributes.get("length"); - if (length != null) { - e.setTarget(java.lang.reflect.Array.class); - e.addArg(subtype); - e.addArg(new Integer(length)); - } - else { - Class arrayClass = java.lang.reflect.Array.newInstance(subtype, 0).getClass(); - e.setTarget(arrayClass); - } - } - else if (name == "java") { - e.setValue(is); // The outermost scope is the stream itself. - } - else if (name == "object") { - } - else { - simulateException("Unrecognized opening tag: " + name + " " + attrsToString(attrs)); - return; - } - - // ids - String idName = (String)attributes.get("id"); - if (idName != null) { - environment.put(idName, e); - } - - // idrefs - String idrefName = (String)attributes.get("idref"); - if (idrefName != null) { - e.setValue(lookup(idrefName)); - } - - // fields - String fieldName = (String)attributes.get("field"); - if (fieldName != null) { - e.setValue(getFieldValue(e.getTarget(), fieldName)); - } - expStack.add(e); - } - - private Object getFieldValue(Object target, String fieldName) { - try { - Class type = target.getClass(); - if (type == Class.class) { - type = (Class)target; - } - java.lang.reflect.Field f = sun.reflect.misc.FieldUtil.getField(type, fieldName); - return f.get(target); - } - catch (Exception e) { - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - return null; - } - } - - private String attrsToString(AttributeList attrs) { - StringBuffer b = new StringBuffer(); - for (int i = 0; i < attrs.getLength (); i++) { - b.append(attrs.getName(i)+"=\""+attrs.getValue(i)+"\" "); - } - return b.toString(); - } - - public void characters(char buf [], int offset, int len) throws SAXException { - chars.append(new String(buf, offset, len)); - } - - private void parseCharCode(String name, Map map) { - if (name == "char") { - String value = (String) map.get("code"); - if (value != null) { - int code = Integer.decode(value); - for (char ch : Character.toChars(code)) { - this.chars.append(ch); - } - } - } - } - - public Object lookup(String s) { - Expression e = (Expression)environment.get(s); - if (e == null) { - simulateException("Unbound variable: " + s); - } - return getValue(e); - } - - public void register(String id, Object value) { - Expression e = new MutableExpression(); - e.setValue(value); - environment.put(id, e); - } - - public void endElement(String name) throws SAXException { - name = name.intern(); // Xerces parser does not supply unique tag names. - if (name == "string") { - this.isString = false; - } else if (this.isString) { - return; - } - if (name == "java") { - return; - } - if (isPrimitive(name) || name == "string" || name == "class") { - addArg(chars.toString()); - } - if (name == "object" || name == "array" || name == "void" || - isPrimitive(name) || name == "string" || name == "class" || - name == "null") { - Expression e = (Expression)pop(expStack); - Object value = getValue(e); - if (name != "void") { - addArg(value); - } - } - else { - simulateException("Unrecognized closing tag: " + name); - } - } -} - - -class MutableExpression extends Expression { - private Object target; - private String methodName; - - private Object property; - private Vector argV = new Vector(); - - private String capitalize(String propertyName) { - if (propertyName.length() == 0) { - return propertyName; - } - return propertyName.substring(0, 1).toUpperCase(ENGLISH) + propertyName.substring(1); - } - - public MutableExpression() { - super(null, null, null); - } - - public Object[] getArguments() { - return argV.toArray(); - } - - public String getMethodName() { - if (property == null) { - return methodName; - } - int setterArgs = (property instanceof String) ? 1 : 2; - String methodName = (argV.size() == setterArgs) ? "set" : "get"; - if (property instanceof String) { - return methodName + capitalize((String)property); - } - else { - return methodName; - } - } - - public void addArg(Object arg) { - argV.add(arg); - } - - public void setTarget(Object target) { - this.target = target; - } - - public Object getTarget() { - return target; - } - - public void setMethodName(String methodName) { - this.methodName = methodName; - } - - public void setProperty(Object property) { - this.property = property; - } - - public void setValue(Object value) { - super.setValue(value); - } - - public Object getValue() throws Exception { - return super.getValue(); - } -} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/AccessorElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/AccessorElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,105 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This is base class that simplifies access to entities (fields or properties). + * The {@code name} attribute specifies the name of the accessible entity. + * The element defines getter if it contains no argument + * or setter if it contains one argument. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +abstract class AccessorElementHandler extends ElementHandler { + private String name; + private ValueObject value; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
name + *
the name of the accessible entity + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("name")) { // NON-NLS: the attribute name + this.name = value; + } else { + super.addAttribute(name, value); + } + } + + /** + * Adds the argument that is used to set the value of this element. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected final void addArgument(Object argument) { + if (this.value != null) { + throw new IllegalStateException("Could not add argument to evaluated element"); + } + setValue(this.name, argument); + this.value = ValueObjectImpl.VOID; + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + if (this.value == null) { + this.value = ValueObjectImpl.create(getValue(this.name)); + } + return this.value; + } + + /** + * Returns the value of the entity with specified {@code name}. + * + * @param name the name of the accessible entity + * @return the value of the specified entity + */ + protected abstract Object getValue(String name); + + /** + * Sets the new value for the entity with specified {@code name}. + * + * @param name the name of the accessible entity + * @param value the new value for the specified entity + */ + protected abstract void setValue(String name, Object value); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,133 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import java.lang.reflect.Array; + +/** + * This class is intended to handle <array> element, + * that is used to array creation. + * The {@code length} attribute specifies the length of the array. + * The {@code class} attribute specifies the elements type. + * The {@link Object} type is used by default. + * For example:
+ * <array length="10"/>
+ * is equivalent to {@code new Component[10]} in Java code. + * The {@code set} and {@code get} methods, + * as defined in the {@link java.util.List} interface, + * can be used as if they could be applied to array instances. + * The {@code index} attribute can thus be used with arrays. + * For example:
+ * <array length="3" class="java.lang.String">
+ *     <void index="1">
+ *         <string>Hello, world</string>
+ *     </void>
+ * </array>
+ * is equivalent to the following Java code:
+ * String[] s = new String[3];
+ * s[1] = "Hello, world";
+ * It is possible to omit the {@code length} attribute and + * specify the values directly, without using {@code void} tags. + * The length of the array is equal to the number of values specified. + * For example:
+ * <array id="array" class="int">
+ *     <int>123</int>
+ *     <int>456</int>
+ * </array>
+ * is equivalent to {@code int[] array = {123, 456}} in Java code. + *

The following atributes are supported: + *

+ *
length + *
the array length + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ArrayElementHandler extends NewElementHandler { + private Integer length; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
length + *
the array length + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("length")) { // NON-NLS: the attribute name + this.length = Integer.valueOf(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Calculates the value of this element + * if the lentgh attribute is set. + */ + @Override + public void startElement() { + if (this.length != null) { + getValueObject(); + } + } + + /** + * Creates an instance of the array. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + */ + @Override + protected ValueObject getValueObject(Class type, Object[] args) { + if (type == null) { + type = Object.class; + } + if (this.length != null) { + return ValueObjectImpl.create(Array.newInstance(type, this.length)); + } + Object array = Array.newInstance(type, args.length); + for (int i = 0; i < args.length; i++) { + Array.set(array, i, args[i]); + } + return ValueObjectImpl.create(array); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/BooleanElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/BooleanElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,69 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <boolean> element. + * This element specifies {@code boolean} values. + * The class {@link Boolean} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <boolean>true</boolean>
+ * is shortcut to
+ * <method name="valueOf" class="java.lang.Boolean">
+ *     <string>true</string>
+ * </method>
+ * which is equivalent to {@code Boolean.valueOf("true")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class BooleanElementHandler extends StringElementHandler { + + /** + * Creates {@code boolean} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code boolean} value + */ + @Override + public Object getValue(String argument) { + if (Boolean.TRUE.toString().equalsIgnoreCase(argument)) { + return Boolean.TRUE; + } + if (Boolean.FALSE.toString().equalsIgnoreCase(argument)) { + return Boolean.FALSE; + } + throw new IllegalArgumentException("Unsupported boolean argument: " + argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ByteElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ByteElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <byte> element. + * This element specifies {@code byte} values. + * The class {@link Byte} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <byte>127</byte>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Byte">
+ *     <string>127</string>
+ * </method>
+ * which is equivalent to {@code Byte.decode("127")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ByteElementHandler extends StringElementHandler { + + /** + * Creates {@code byte} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code byte} value + */ + @Override + public Object getValue(String argument) { + return Byte.decode(argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/CharElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/CharElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,92 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <char> element. + * This element specifies {@code char} values. + * The class {@link Character} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <char>X</char>
+ * which is equivalent to {@code Character.valueOf('X')} in Java code. + *

The following atributes are supported: + *

+ *
code + *
this attribute specifies character code + *
id + *
the identifier of the variable that is intended to store the result + *
+ * The {@code code} attribute can be used for characters + * that are illegal in XML document, for example:
+ * <char code="0"/>
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class CharElementHandler extends StringElementHandler { + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
code + *
this attribute specifies character code + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("code")) { // NON-NLS: the attribute name + int code = Integer.decode(value); + for (char ch : Character.toChars(code)) { + addCharacter(ch); + } + } else { + super.addAttribute(name, value); + } + } + + /** + * Creates {@code char} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code char} value + */ + @Override + public Object getValue(String argument) { + if (argument.length() != 1) { + throw new IllegalArgumentException("Wrong characters count"); + } + return Character.valueOf(argument.charAt(0)); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ClassElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ClassElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <class> element. + * This element specifies {@link Class} values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <class>java.lang.Class</class>
+ * is shortcut to
+ * <method name="forName" class="java.lang.Class">
+ *     <string>java.lang.Class</string>
+ * </method>
+ * which is equivalent to {@code Class.forName("java.lang.Class")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ClassElementHandler extends StringElementHandler { + + /** + * Creates class by the name from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code Class} value + */ + @Override + public Object getValue(String argument) { + return getOwner().findClass(argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,389 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.ClassFinder; + +import java.beans.ExceptionListener; + +import java.io.IOException; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * The main class to parse JavaBeans XML archive. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + * + * @see ElementHandler + */ +public final class DocumentHandler extends DefaultHandler { + private final Map> handlers = new HashMap>(); + + private final Map environment = new HashMap(); + + private final List objects = new ArrayList(); + + private Reference loader; + private ExceptionListener listener; + private Object owner; + + private ElementHandler handler; + + /** + * Creates new instance of document handler. + */ + public DocumentHandler() { + setElementHandler("java", JavaElementHandler.class); // NON-NLS: the element name + setElementHandler("null", NullElementHandler.class); // NON-NLS: the element name + setElementHandler("array", ArrayElementHandler.class); // NON-NLS: the element name + setElementHandler("class", ClassElementHandler.class); // NON-NLS: the element name + setElementHandler("string", StringElementHandler.class); // NON-NLS: the element name + setElementHandler("object", ObjectElementHandler.class); // NON-NLS: the element name + + setElementHandler("void", VoidElementHandler.class); // NON-NLS: the element name + setElementHandler("char", CharElementHandler.class); // NON-NLS: the element name + setElementHandler("byte", ByteElementHandler.class); // NON-NLS: the element name + setElementHandler("short", ShortElementHandler.class); // NON-NLS: the element name + setElementHandler("int", IntElementHandler.class); // NON-NLS: the element name + setElementHandler("long", LongElementHandler.class); // NON-NLS: the element name + setElementHandler("float", FloatElementHandler.class); // NON-NLS: the element name + setElementHandler("double", DoubleElementHandler.class); // NON-NLS: the element name + setElementHandler("boolean", BooleanElementHandler.class); // NON-NLS: the element name + + // some handlers for new elements + setElementHandler("new", NewElementHandler.class); // NON-NLS: the element name + setElementHandler("var", VarElementHandler.class); // NON-NLS: the element name + setElementHandler("true", TrueElementHandler.class); // NON-NLS: the element name + setElementHandler("false", FalseElementHandler.class); // NON-NLS: the element name + setElementHandler("field", FieldElementHandler.class); // NON-NLS: the element name + setElementHandler("method", MethodElementHandler.class); // NON-NLS: the element name + setElementHandler("property", PropertyElementHandler.class); // NON-NLS: the element name + } + + /** + * Returns the class loader used to instantiate objects. + * If the class loader has not been explicitly set + * then {@code null} is returned. + * + * @return the class loader used to instantiate objects + */ + public ClassLoader getClassLoader() { + return (this.loader != null) + ? this.loader.get() + : null; + } + + /** + * Sets the class loader used to instantiate objects. + * If the class loader is not set + * then default class loader will be used. + * + * @param loader a classloader to use + */ + public void setClassLoader(ClassLoader loader) { + this.loader = new WeakReference(loader); + } + + /** + * Returns the exception listener for parsing. + * The exception listener is notified + * when handler catches recoverable exceptions. + * If the exception listener has not been explicitly set + * then default exception listener is returned. + * + * @return the exception listener for parsing + */ + public ExceptionListener getExceptionListener() { + return this.listener; + } + + /** + * Sets the exception listener for parsing. + * The exception listener is notified + * when handler catches recoverable exceptions. + * + * @param listener the exception listener for parsing + */ + public void setExceptionListener(ExceptionListener listener) { + this.listener = listener; + } + + /** + * Returns the owner of this document handler. + * + * @return the owner of this document handler + */ + public Object getOwner() { + return this.owner; + } + + /** + * Sets the owner of this document handler. + * + * @param owner the owner of this document handler + */ + public void setOwner(Object owner) { + this.owner = owner; + } + + /** + * Returns the handler for the element with specified name. + * + * @param name the name of the element + * @return the corresponding element handler + */ + public Class getElementHandler(String name) { + Class type = this.handlers.get(name); + if (type == null) { + throw new IllegalArgumentException("Unsupported element: " + name); + } + return type; + } + + /** + * Sets the handler for the element with specified name. + * + * @param name the name of the element + * @param handler the corresponding element handler + */ + public void setElementHandler(String name, Class handler) { + this.handlers.put(name, handler); + } + + /** + * Indicates whether the variable with specified identifier is defined. + * + * @param id the identifier + * @return @{code true} if the variable is defined; + * @{code false} otherwise + */ + public boolean hasVariable(String id) { + return this.environment.containsKey(id); + } + + /** + * Returns the value of the variable with specified identifier. + * + * @param id the identifier + * @return the value of the variable + */ + public Object getVariable(String id) { + if (!this.environment.containsKey(id)) { + throw new IllegalArgumentException("Unbound variable: " + id); + } + return this.environment.get(id); + } + + /** + * Sets new value of the variable with specified identifier. + * + * @param id the identifier + * @param value new value of the variable + */ + public void setVariable(String id, Object value) { + this.environment.put(id, value); + } + + /** + * Returns the array of readed objects. + * + * @return the array of readed objects + */ + public Object[] getObjects() { + return this.objects.toArray(); + } + + /** + * Adds the object to the list of readed objects. + * + * @param object the object that is readed from XML document + */ + void addObject(Object object) { + this.objects.add(object); + } + + /** + * Prepares this handler to read objects from XML document. + */ + @Override + public void startDocument() { + this.objects.clear(); + this.handler = null; + } + + /** + * Parses opening tag of XML element + * using corresponding element handler. + * + * @param uri the namespace URI, or the empty string + * if the element has no namespace URI or + * if namespace processing is not being performed + * @param localName the local name (without prefix), or the empty string + * if namespace processing is not being performed + * @param qName the qualified name (with prefix), or the empty string + * if qualified names are not available + * @param attributes the attributes attached to the element + */ + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + ElementHandler parent = this.handler; + try { + this.handler = getElementHandler(qName).newInstance(); + this.handler.setOwner(this); + this.handler.setParent(parent); + } + catch (Exception exception) { + throw new SAXException(exception); + } + for (int i = 0; i < attributes.getLength(); i++) + try { + String name = attributes.getQName(i); + String value = attributes.getValue(i); + this.handler.addAttribute(name, value); + } + catch (RuntimeException exception) { + handleException(exception); + } + + this.handler.startElement(); + } + + /** + * Parses closing tag of XML element + * using corresponding element handler. + * + * @param uri the namespace URI, or the empty string + * if the element has no namespace URI or + * if namespace processing is not being performed + * @param localName the local name (without prefix), or the empty string + * if namespace processing is not being performed + * @param qName the qualified name (with prefix), or the empty string + * if qualified names are not available + */ + @Override + public void endElement(String uri, String localName, String qName) { + try { + this.handler.endElement(); + } + catch (RuntimeException exception) { + handleException(exception); + } + finally { + this.handler = this.handler.getParent(); + } + } + + /** + * Parses character data inside XML element. + * + * @param chars the array of characters + * @param start the start position in the character array + * @param length the number of characters to use + */ + @Override + public void characters(char[] chars, int start, int length) { + if (this.handler != null) { + try { + while (0 < length--) { + this.handler.addCharacter(chars[start++]); + } + } + catch (RuntimeException exception) { + handleException(exception); + } + } + } + + /** + * Handles an exception using current exception listener. + * + * @param exception an exception to handle + * @see #setExceptionListener + */ + public void handleException(Exception exception) { + if (this.listener == null) { + throw new IllegalStateException(exception); + } + this.listener.exceptionThrown(exception); + } + + /** + * Starts parsing of the specified input source. + * + * @param input the input source to parse + */ + public void parse(InputSource input) { + try { + SAXParserFactory.newInstance().newSAXParser().parse(input, this); + } + catch (ParserConfigurationException exception) { + handleException(exception); + } + catch (SAXException wrapper) { + Exception exception = wrapper.getException(); + if (exception == null) { + exception = wrapper; + } + handleException(exception); + } + catch (IOException exception) { + handleException(exception); + } + } + + /** + * Resolves class by name using current class loader. + * This method handles exception using current exception listener. + * + * @param name the name of the class + * @return the object that represents the class + */ + public Class findClass(String name) { + try { + return ClassFinder.resolveClass(name, getClassLoader()); + } + catch (ClassNotFoundException exception) { + handleException(exception); + return null; + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/DoubleElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/DoubleElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <double> element. + * This element specifies {@code double} values. + * The class {@link Double} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <double>1.23e45</double>
+ * is shortcut to
+ * <method name="valueOf" class="java.lang.Double">
+ *     <string>1.23e45</string>
+ * </method>
+ * which is equivalent to {@code Double.valueOf("1.23e45")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class DoubleElementHandler extends StringElementHandler { + + /** + * Creates {@code double} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code double} value + */ + @Override + public Object getValue(String argument) { + return Double.valueOf(argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,224 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * The base class for element handlers. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + * + * @see DocumentHandler + */ +public abstract class ElementHandler { + private DocumentHandler owner; + private ElementHandler parent; + + private String id; + + /** + * Returns the document handler that creates this element handler. + * + * @return the owner document handler + */ + public final DocumentHandler getOwner() { + return this.owner; + } + + /** + * Sets the document handler that creates this element handler. + * The owner document handler should be set after instantiation. + * Such approach is used to simplify the extensibility. + * + * @param owner the owner document handler + * @see DocumentHandler#startElement + */ + final void setOwner(DocumentHandler owner) { + if (owner == null) { + throw new IllegalArgumentException("Every element should have owner"); + } + this.owner = owner; + } + + /** + * Returns the element handler that contains this one. + * + * @return the parent element handler + */ + public final ElementHandler getParent() { + return this.parent; + } + + /** + * Sets the element handler that contains this one. + * The parent element handler should be set after instantiation. + * Such approach is used to simplify the extensibility. + * + * @param parent the parent element handler + * @see DocumentHandler#startElement + */ + final void setParent(ElementHandler parent) { + this.parent = parent; + } + + /** + * Returns the value of the variable with specified identifier. + * + * @param id the identifier + * @return the value of the variable + */ + protected final Object getVariable(String id) { + if (id.equals(this.id)) { + ValueObject value = getValueObject(); + if (value.isVoid()) { + throw new IllegalStateException("The element does not return value"); + } + return value.getValue(); + } + return (this.parent != null) + ? this.parent.getVariable(id) + : this.owner.getVariable(id); + } + + /** + * Returns the value of the parent element. + * + * @return the value of the parent element + */ + protected Object getContextBean() { + if (this.parent != null) { + ValueObject value = this.parent.getValueObject(); + if (!value.isVoid()) { + return value.getValue(); + } + throw new IllegalStateException("The outer element does not return value"); + } else { + Object value = this.owner.getOwner(); + if (value != null) { + return value; + } + throw new IllegalStateException("The topmost element does not have context"); + } + } + + /** + * Parses attributes of the element. + * By default, the following atribute is supported: + *
+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + public void addAttribute(String name, String value) { + if (name.equals("id")) { // NON-NLS: the attribute name + this.id = value; + } else { + throw new IllegalArgumentException("Unsupported attribute: " + name); + } + } + + /** + * This method is called before parsing of the element's body. + * All attributes are parsed at this point. + * By default, do nothing. + */ + public void startElement() { + } + + /** + * This method is called after parsing of the element's body. + * By default, it calculates the value of this element. + * The following tasks are executing for any non-void value: + *
    + *
  1. If the {@code id} attribute is set + * the value of the variable with the specified identifier + * is set to the value of this element.
  2. + *
  3. This element is used as an argument of parent element if it is possible.
  4. + *
+ * + * @see #isArgument + */ + public void endElement() { + // do nothing if no value returned + ValueObject value = getValueObject(); + if (!value.isVoid()) { + if (this.id != null) { + this.owner.setVariable(this.id, value.getValue()); + } + if (isArgument()) { + if (this.parent != null) { + this.parent.addArgument(value.getValue()); + } else { + this.owner.addObject(value.getValue()); + } + } + } + } + + /** + * Adds the character that contained in this element. + * By default, only whitespaces are acceptable. + * + * @param ch the character + */ + public void addCharacter(char ch) { + if ((ch != ' ') && (ch != '\n') && (ch != '\t') && (ch != '\r')) { + throw new IllegalStateException("Illegal character with code " + (int) ch); + } + } + + /** + * Adds the argument that is used to calculate the value of this element. + * By default, no arguments are acceptable. + * + * @param argument the value of the element that contained in this one + */ + protected void addArgument(Object argument) { + throw new IllegalStateException("Could not add argument to simple element"); + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element can be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + protected boolean isArgument() { + return this.id == null; + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + protected abstract ValueObject getValueObject(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/FalseElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/FalseElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <false> element. + * This element specifies {@code false} value. + * It should not contain body or inner elements. + * For example:
+ * <false/>
+ * is equivalent to {@code false} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class FalseElementHandler extends NullElementHandler { + + /** + * Returns {@code Boolean.FALSE} + * as a value of <false> element. + * + * @return {@code Boolean.FALSE} by default + */ + @Override + public Object getValue() { + return Boolean.FALSE; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/FieldElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/FieldElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,189 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.FieldFinder; + +import java.lang.reflect.Field; + +/** + * This class is intended to handle <field> element. + * This element simplifies access to the fields. + * If the {@code class} attribute is specified + * this element accesses static field of specified class. + * This element defines getter if it contains no argument. + * It returns the value of the field in this case. + * For example:
+ * <field name="TYPE" class="java.lang.Long"/>
+ * is equivalent to {@code Long.TYPE} in Java code. + * This element defines setter if it contains one argument. + * It does not return the value of the field in this case. + * For example:
+ * <field name="id"><int>0</int></field>
+ * is equivalent to {@code id = 0} in Java code. + *

The following atributes are supported: + *

+ *
name + *
the field name + *
class + *
the type is used for static fields only + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class FieldElementHandler extends AccessorElementHandler { + private Class type; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
name + *
the field name + *
class + *
the type is used for static fields only + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("class")) { // NON-NLS: the attribute name + this.type = getOwner().findClass(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return super.isArgument() && (this.type != null); // only static accessor can be used an argument + } + + /** + * Returns the context of the field. + * The context of the static field is the class object. + * The context of the non-static field is the value of the parent element. + * + * @return the context of the field + */ + @Override + protected Object getContextBean() { + return (this.type != null) + ? this.type + : super.getContextBean(); + } + + /** + * Returns the value of the field with specified {@code name}. + * + * @param name the name of the field + * @return the value of the specified field + */ + @Override + protected Object getValue(String name) { + try { + return getFieldValue(getContextBean(), name); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + return null; + } + + /** + * Sets the new value for the field with specified {@code name}. + * + * @param name the name of the field + * @param value the new value for the specified field + */ + @Override + protected void setValue(String name, Object value) { + try { + setFieldValue(getContextBean(), name, value); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + } + + /** + * Performs the search of the field with specified {@code name} + * in specified context and returns its value. + * + * @param bean the context bean that contains field + * @param name the name of the field + * @return the value of the field + * @throws IllegalAccessException if the field is not accesible + * @throws NoSuchFieldException if the field is not found + */ + static Object getFieldValue(Object bean, String name) throws IllegalAccessException, NoSuchFieldException { + return findField(bean, name).get(bean); + } + + /** + * Performs the search of the field with specified {@code name} + * in specified context and updates its value. + * + * @param bean the context bean that contains field + * @param name the name of the field + * @param value the new value for the field + * @throws IllegalAccessException if the field is not accesible + * @throws NoSuchFieldException if the field is not found + */ + private static void setFieldValue(Object bean, String name, Object value) throws IllegalAccessException, NoSuchFieldException { + findField(bean, name).set(bean, value); + } + + /** + * Performs the search of the field + * with specified {@code name} in specified context. + * + * @param bean the context bean that contains field + * @param name the name of the field + * @return field object that represents found field + * @throws NoSuchFieldException if the field is not found + */ + private static Field findField(Object bean, String name) throws NoSuchFieldException { + return (bean instanceof Class) + ? FieldFinder.findStaticField((Class) bean, name) + : FieldFinder.findField(bean.getClass(), name); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/FloatElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/FloatElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <float> element. + * This element specifies {@code float} values. + * The class {@link Float} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <float>-1.23</float>
+ * is shortcut to
+ * <method name="valueOf" class="java.lang.Float">
+ *     <string>-1.23</string>
+ * </method>
+ * which is equivalent to {@code Float.valueOf("-1.23")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class FloatElementHandler extends StringElementHandler { + + /** + * Creates {@code float} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code float} value + */ + @Override + public Object getValue(String argument) { + return Float.valueOf(argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/IntElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/IntElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <int> element. + * This element specifies {@code int} values. + * The class {@link Integer} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <int>-1</int>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Integer">
+ *     <string>-1</string>
+ * </method>
+ * which is equivalent to {@code Integer.decode("-1")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class IntElementHandler extends StringElementHandler { + + /** + * Creates {@code int} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code int} value + */ + @Override + public Object getValue(String argument) { + return Integer.decode(argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/JavaElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/JavaElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,151 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import java.beans.XMLDecoder; + +/** + * This class is intended to handle <java> element. + * Each element that appears in the body of this element + * is evaluated in the context of the decoder itself. + * Typically this outer context is used to retrieve the owner of the decoder, + * which can be set before reading the archive. + *

The following atributes are supported: + *

+ *
version + *
the Java version (not supported) + *
class + *
the type of preferable parser (not supported) + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @see DocumentHandler#getOwner + * @see DocumentHandler#setOwner + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class JavaElementHandler extends ElementHandler { + private Class type; + private ValueObject value; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
version + *
the Java version (not supported) + *
class + *
the type of preferable parser (not supported) + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("version")) { // NON-NLS: the attribute name + // unsupported attribute + } else if (name.equals("class")) { // NON-NLS: the attribute name + // check class for owner + this.type = getOwner().findClass(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Adds the argument to the list of readed objects. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected void addArgument(Object argument) { + getOwner().addObject(argument); + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return false; // do not use owner as object + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected ValueObject getValueObject() { + if (this.value == null) { + this.value = ValueObjectImpl.create(getValue()); + } + return this.value; + } + + /** + * Returns the owner of the owner document handler + * as a value of <java> element. + * + * @return the owner of the owner document handler + */ + private Object getValue() { + Object owner = getOwner().getOwner(); + if ((this.type == null) || isValid(owner)) { + return owner; + } + if (owner instanceof XMLDecoder) { + XMLDecoder decoder = (XMLDecoder) owner; + owner = decoder.getOwner(); + if (isValid(owner)) { + return owner; + } + } + throw new IllegalStateException("Unexpected owner class: " + owner.getClass().getName()); + } + + /** + * Validates the owner of the <java> element. + * The owner is valid if it is {@code null} or an instance + * of the class specified by the {@code class} attribute. + * + * @param owner the owner of the <java> element + * @return {@code true} if the {@code owner} is valid; + * {@code false} otherwise + */ + private boolean isValid(Object owner) { + return (owner == null) || this.type.isInstance(owner); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/LongElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/LongElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <long> element. + * This element specifies {@code long} values. + * The class {@link Long} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <long>0xFFFF</long>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Long">
+ *     <string>0xFFFF</string>
+ * </method>
+ * which is equivalent to {@code Long.decode("0xFFFF")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class LongElementHandler extends StringElementHandler { + + /** + * Creates {@code long} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code long} value + */ + @Override + public Object getValue(String argument) { + return Long.decode(argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/MethodElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/MethodElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,109 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.MethodFinder; + +import java.lang.reflect.Method; + +/** + * This class is intended to handle <method> element. + * It describes invocation of the method. + * The {@code name} attribute denotes + * the name of the method to invoke. + * If the {@code class} attribute is specified + * this element invokes static method of specified class. + * The inner elements specifies the arguments of the method. + * For example:
+ * <method name="valueOf" class="java.lang.Long">
+ *     <string>10</string>
+ * </method>
+ * is equivalent to {@code Long.valueOf("10")} in Java code. + *

The following atributes are supported: + *

+ *
name + *
the method name + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class MethodElementHandler extends NewElementHandler { + private String name; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
name + *
the method name + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("name")) { // NON-NLS: the attribute name + this.name = value; + } else { + super.addAttribute(name, value); + } + } + + /** + * Returns the result of method execution. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + * @throws Exception if calculation is failed + */ + @Override + protected ValueObject getValueObject(Class type, Object[] args) throws Exception { + Object bean = getContextBean(); + Class[] types = getArgumentTypes(args); + Method method = (type != null) + ? MethodFinder.findStaticMethod(type, this.name, types) + : MethodFinder.findMethod(bean.getClass(), this.name, types); + + if (method.isVarArgs()) { + args = getArguments(args, method.getParameterTypes()); + } + Object value = method.invoke(bean, args); + return method.getReturnType().equals(void.class) + ? ValueObjectImpl.VOID + : ValueObjectImpl.create(value); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/NewElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/NewElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,205 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.ConstructorFinder; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is intended to handle <new> element. + * It describes instantiation of the object. + * The {@code class} attribute denotes + * the name of the class to instantiate. + * The inner elements specifies the arguments of the constructor. + * For example:
+ * <new class="java.lang.Long">
+ *     <string>10</string>
+ * </new>
+ * is equivalent to {@code new Long("10")} in Java code. + *

The following atributes are supported: + *

+ *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +class NewElementHandler extends ElementHandler { + private List arguments = new ArrayList(); + private ValueObject value = ValueObjectImpl.VOID; + + private Class type; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("class")) { // NON-NLS: the attribute name + this.type = getOwner().findClass(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Adds the argument to the list of arguments + * that is used to calculate the value of this element. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected final void addArgument(Object argument) { + if (this.arguments == null) { + throw new IllegalStateException("Could not add argument to evaluated element"); + } + this.arguments.add(argument); + } + + /** + * Returns the context of the method. + * The context of the static method is the class object. + * The context of the non-static method is the value of the parent element. + * + * @return the context of the method + */ + @Override + protected final Object getContextBean() { + return (this.type != null) + ? this.type + : super.getContextBean(); + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + if (this.arguments != null) { + try { + this.value = getValueObject(this.type, this.arguments.toArray()); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + finally { + this.arguments = null; + } + } + return this.value; + } + + /** + * Calculates the value of this element + * using the base class and the array of arguments. + * By default, it creates an instance of the base class. + * This method should be overridden in those handlers + * that extend behavior of this element. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + * @throws Exception if calculation is failed + */ + ValueObject getValueObject(Class type, Object[] args) throws Exception { + if (type == null) { + throw new IllegalArgumentException("Class name is not set"); + } + Class[] types = getArgumentTypes(args); + Constructor constructor = ConstructorFinder.findConstructor(type, types); + if (constructor.isVarArgs()) { + args = getArguments(args, constructor.getParameterTypes()); + } + return ValueObjectImpl.create(constructor.newInstance(args)); + } + + /** + * Converts the array of arguments to the array of corresponding classes. + * If argument is {@code null} the class is {@code null} too. + * + * @param arguments the array of arguments + * @return the array of corresponding classes + */ + static Class[] getArgumentTypes(Object[] arguments) { + Class[] types = new Class[arguments.length]; + for (int i = 0; i < arguments.length; i++) { + if (arguments[i] != null) { + types[i] = arguments[i].getClass(); + } + } + return types; + } + + /** + * Resolves variable arguments. + * + * @param arguments the array of arguments + * @param types the array of parameter types + * @return the resolved array of arguments + */ + static Object[] getArguments(Object[] arguments, Class[] types) { + int index = types.length - 1; + if (types.length == arguments.length) { + Object argument = arguments[index]; + if (argument == null) { + return arguments; + } + Class type = types[index]; + if (type.isAssignableFrom(argument.getClass())) { + return arguments; + } + } + int length = arguments.length - index; + Class type = types[index].getComponentType(); + Object array = Array.newInstance(type, length); + System.arraycopy(arguments, index, array, 0, length); + + Object[] args = new Object[types.length]; + System.arraycopy(arguments, 0, args, 0, index); + args[index] = array; + return args; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/NullElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/NullElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <null> element. + * This element specifies {@code null} value. + * It should not contain body or inner elements. + * For example:
+ * <null/>
+ * is equivalent to {@code null} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +class NullElementHandler extends ElementHandler implements ValueObject { + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + return this; + } + + /** + * Returns {@code null} + * as a value of <null> element. + * This method should be overridden in those handlers + * that extend behavior of this element. + * + * @return {@code null} by default + */ + public Object getValue() { + return null; + } + + /** + * Returns {@code void} state of this value object. + * + * @return {@code false} always + */ + public final boolean isVoid() { + return false; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ObjectElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ObjectElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,168 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import java.beans.Expression; + +import static java.util.Locale.ENGLISH; + +/** + * This class is intended to handle <object> element. + * This element looks like <void> element, + * but its value is always used as an argument for element + * that contains this one. + *

The following atributes are supported: + *

+ *
class + *
the type is used for static methods and fields + *
method + *
the method name + *
property + *
the property name + *
index + *
the property index + *
field + *
the field name + *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +class ObjectElementHandler extends NewElementHandler { + private String idref; + private String field; + private Integer index; + private String property; + private String method; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
class + *
the type is used for static methods and fields + *
method + *
the method name + *
property + *
the property name + *
index + *
the property index + *
field + *
the field name + *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public final void addAttribute(String name, String value) { + if (name.equals("idref")) { // NON-NLS: the attribute name + this.idref = value; + } else if (name.equals("field")) { // NON-NLS: the attribute name + this.field = value; + } else if (name.equals("index")) { // NON-NLS: the attribute name + this.index = Integer.valueOf(value); + addArgument(this.index); // hack for compatibility + } else if (name.equals("property")) { // NON-NLS: the attribute name + this.property = value; + } else if (name.equals("method")) { // NON-NLS: the attribute name + this.method = value; + } else { + super.addAttribute(name, value); + } + } + + /** + * Calculates the value of this element + * if the field attribute or the idref attribute is set. + */ + @Override + public final void startElement() { + if ((this.field != null) || (this.idref != null)) { + getValueObject(); + } + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element can be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return true; // hack for compatibility + } + + /** + * Creates the value of this element. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + * @throws Exception if calculation is failed + */ + @Override + protected final ValueObject getValueObject(Class type, Object[] args) throws Exception { + if (this.field != null) { + return ValueObjectImpl.create(FieldElementHandler.getFieldValue(getContextBean(), this.field)); + } + if (this.idref != null) { + return ValueObjectImpl.create(getVariable(this.idref)); + } + Object bean = getContextBean(); + String name; + if (this.index != null) { + name = (args.length == 2) + ? PropertyElementHandler.SETTER + : PropertyElementHandler.GETTER; + } else if (this.property != null) { + name = (args.length == 1) + ? PropertyElementHandler.SETTER + : PropertyElementHandler.GETTER; + + if (0 < this.property.length()) { + name += this.property.substring(0, 1).toUpperCase(ENGLISH) + this.property.substring(1); + } + } else { + name = (this.method != null) && (0 < this.method.length()) + ? this.method + : "new"; // NON-NLS: the constructor marker + } + Expression expression = new Expression(bean, name, args); + return ValueObjectImpl.create(expression.getValue()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,287 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.MethodFinder; + +import java.beans.IndexedPropertyDescriptor; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; + +import java.lang.reflect.Array; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * This class is intended to handle <property> element. + * This element simplifies access to the properties. + * If the {@code index} attribute is specified + * this element uses additional {@code int} parameter. + * If the {@code name} attribute is not specified + * this element uses method "get" as getter + * and method "set" as setter. + * This element defines getter if it contains no argument. + * It returns the value of the property in this case. + * For example:
+ * <property name="object" index="10"/>
+ * is shortcut to
+ * <method name="getObject">
+ *     <int>10</int>
+ * </method>
+ * which is equivalent to {@code getObject(10)} in Java code. + * This element defines setter if it contains one argument. + * It does not return the value of the property in this case. + * For example:
+ * <property><int>0</int></property>
+ * is shortcut to
+ * <method name="set">
+ *     <int>0</int>
+ * </method>
+ * which is equivalent to {@code set(0)} in Java code. + *

The following atributes are supported: + *

+ *
name + *
the property name + *
index + *
the property index + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class PropertyElementHandler extends AccessorElementHandler { + static final String GETTER = "get"; // NON-NLS: the getter prefix + static final String SETTER = "set"; // NON-NLS: the setter prefix + + private Integer index; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
name + *
the property name + *
index + *
the property index + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("index")) { // NON-NLS: the attribute name + this.index = Integer.valueOf(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return false; // non-static accessor cannot be used an argument + } + + /** + * Returns the value of the property with specified {@code name}. + * + * @param name the name of the property + * @return the value of the specified property + */ + @Override + protected Object getValue(String name) { + try { + return getPropertyValue(getContextBean(), name, this.index); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + return null; + } + + /** + * Sets the new value for the property with specified {@code name}. + * + * @param name the name of the property + * @param value the new value for the specified property + */ + @Override + protected void setValue(String name, Object value) { + try { + setPropertyValue(getContextBean(), name, this.index, value); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + } + + /** + * Performs the search of the getter for the property + * with specified {@code name} in specified class + * and returns value of the property. + * + * @param bean the context bean that contains property + * @param name the name of the property + * @param index the index of the indexed property + * @return the value of the property + * @throws IllegalAccessException if the property is not accesible + * @throws IntrospectionException if the bean introspection is failed + * @throws InvocationTargetException if the getter cannot be invoked + * @throws NoSuchMethodException if the getter is not found + */ + private static Object getPropertyValue(Object bean, String name, Integer index) throws IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { + Class type = bean.getClass(); + if (index == null) { + return findGetter(type, name).invoke(bean); + } else if (type.isArray() && (name == null)) { + return Array.get(bean, index); + } else { + return findGetter(type, name, int.class).invoke(bean, index); + } + } + + /** + * Performs the search of the setter for the property + * with specified {@code name} in specified class + * and updates value of the property. + * + * @param bean the context bean that contains property + * @param name the name of the property + * @param index the index of the indexed property + * @param value the new value for the property + * @throws IllegalAccessException if the property is not accesible + * @throws IntrospectionException if the bean introspection is failed + * @throws InvocationTargetException if the setter cannot be invoked + * @throws NoSuchMethodException if the setter is not found + */ + private static void setPropertyValue(Object bean, String name, Integer index, Object value) throws IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { + Class type = bean.getClass(); + Class param = (value != null) + ? value.getClass() + : null; + + if (index == null) { + findSetter(type, name, param).invoke(bean, value); + } else if (type.isArray() && (name == null)) { + Array.set(bean, index, value); + } else { + findSetter(type, name, int.class, param).invoke(bean, index, value); + } + } + + /** + * Performs the search of the getter for the property + * with specified {@code name} in specified class. + * + * @param type the class that contains method + * @param name the name of the property + * @param args the method arguments + * @return method object that represents found getter + * @throws IntrospectionException if the bean introspection is failed + * @throws NoSuchMethodException if method is not found + */ + private static Method findGetter(Class type, String name, Class...args) throws IntrospectionException, NoSuchMethodException { + if (name == null) { + return MethodFinder.findInstanceMethod(type, GETTER, args); + } + PropertyDescriptor pd = getProperty(type, name); + if (args.length == 0) { + Method method = pd.getReadMethod(); + if (method != null) { + return method; + } + } else if (pd instanceof IndexedPropertyDescriptor) { + IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd; + Method method = ipd.getIndexedReadMethod(); + if (method != null) { + return method; + } + } + throw new IntrospectionException("Could not find getter for the " + name + " property"); + } + + /** + * Performs the search of the setter for the property + * with specified {@code name} in specified class. + * + * @param type the class that contains method + * @param name the name of the property + * @param args the method arguments + * @return method object that represents found setter + * @throws IntrospectionException if the bean introspection is failed + * @throws NoSuchMethodException if method is not found + */ + private static Method findSetter(Class type, String name, Class...args) throws IntrospectionException, NoSuchMethodException { + if (name == null) { + return MethodFinder.findInstanceMethod(type, SETTER, args); + } + PropertyDescriptor pd = getProperty(type, name); + if (args.length == 1) { + Method method = pd.getWriteMethod(); + if (method != null) { + return method; + } + } else if (pd instanceof IndexedPropertyDescriptor) { + IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd; + Method method = ipd.getIndexedWriteMethod(); + if (method != null) { + return method; + } + } + throw new IntrospectionException("Could not find setter for the " + name + " property"); + } + + /** + * Performs the search of the descriptor for the property + * with specified {@code name} in specified class. + * + * @param type the class to introspect + * @param name the property name + * @return descriptor for the named property + * @throws IntrospectionException if property descriptor is not found + */ + private static PropertyDescriptor getProperty(Class type, String name) throws IntrospectionException { + for (PropertyDescriptor pd : Introspector.getBeanInfo(type).getPropertyDescriptors()) { + if (name.equals(pd.getName())) { + return pd; + } + } + throw new IntrospectionException("Could not find the " + name + " property descriptor"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ShortElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ShortElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <short> element. + * This element specifies {@code short} values. + * The class {@link Short} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <short>200</short>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Short">
+ *     <string>200</string>
+ * </method>
+ * which is equivalent to {@code Short.decode("200")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ShortElementHandler extends StringElementHandler { + + /** + * Creates {@code short} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code short} value + */ + @Override + public Object getValue(String argument) { + return Short.decode(argument); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/StringElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/StringElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,116 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <string> element. + * This element specifies {@link String} values. + * The result value is created from text of the body of this element. + * For example:
+ * <string>description</string>
+ * is equivalent to {@code "description"} in Java code. + * The value of inner element is calculated + * before adding to the string using {@link String#valueOf(Object)}. + * Note that all characters are used including whitespaces (' ', '\t', '\n', '\r'). + * So the value of the element
+ * <string><true></string>
+ * is not equal to the value of the element
+ * <string>
+ *     <true>
+ * </string>
+ *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public class StringElementHandler extends ElementHandler { + private StringBuilder sb = new StringBuilder(); + private ValueObject value = ValueObjectImpl.NULL; + + /** + * Adds the character that contained in this element. + * + * @param ch the character + */ + @Override + public final void addCharacter(char ch) { + if (this.sb == null) { + throw new IllegalStateException("Could not add chararcter to evaluated string element"); + } + this.sb.append(ch); + } + + /** + * Adds the string value of the argument to the string value of this element. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected final void addArgument(Object argument) { + if (this.sb == null) { + throw new IllegalStateException("Could not add argument to evaluated string element"); + } + this.sb.append(argument); + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + if (this.sb != null) { + try { + this.value = ValueObjectImpl.create(getValue(this.sb.toString())); + } + catch (RuntimeException exception) { + getOwner().handleException(exception); + } + finally { + this.sb = null; + } + } + return this.value; + } + + /** + * Returns the text of the body of this element. + * This method evaluates value from text of the body, + * and should be overridden in those handlers + * that extend behavior of this element. + * + * @param argument the text of the body + * @return evaluated value + */ + protected Object getValue(String argument) { + return argument; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/TrueElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/TrueElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <true> element. + * This element specifies {@code true} value. + * It should not contain body or inner elements. + * For example:
+ * <true/>
+ * is equivalent to {@code true} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class TrueElementHandler extends NullElementHandler { + + /** + * Returns {@code Boolean.TRUE} + * as a value of <true> element. + * + * @return {@code Boolean.TRUE} by default + */ + @Override + public Object getValue() { + return Boolean.TRUE; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ValueObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ValueObject.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,50 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This interface represents the result of method execution. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public interface ValueObject { + + /** + * Returns the result of method execution. + * + * @return the result of method execution + */ + Object getValue(); + + /** + * Returns {@code void} state of this value object. + * + * @return {@code true} if value can be ignored, + * {@code false} otherwise + */ + boolean isVoid(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/ValueObjectImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/ValueObjectImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,88 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This utility class provides {@code static} method + * to create the object that contains the result of method execution. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ValueObjectImpl implements ValueObject { + static final ValueObject NULL = new ValueObjectImpl(null); + static final ValueObject VOID = new ValueObjectImpl(); + + /** + * Returns the object that describes returning value. + * + * @param value the result of method execution + * @return the object that describes value + */ + static ValueObject create(Object value) { + return (value != null) + ? new ValueObjectImpl(value) + : NULL; + } + + private Object value; + private boolean isVoid; + + /** + * Creates the object that describes returning void value. + */ + private ValueObjectImpl() { + this.isVoid = true; + } + + /** + * Creates the object that describes returning non-void value. + * + * @param value the result of method execution + */ + private ValueObjectImpl(Object value) { + this.value = value; + } + + /** + * Returns the result of method execution. + * + * @return the result of method execution + */ + public Object getValue() { + return this.value; + } + + /** + * Returns {@code void} state of this value object. + * + * @return {@code true} if value should be ignored, + * {@code false} otherwise + */ + public boolean isVoid() { + return this.isVoid; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/VarElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/VarElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,82 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <var> element. + * This element retrieves the value of specified variable. + * For example:
+ * <var id="id1" idref="id2"/>
+ * is equivalent to {@code id1 = id2} in Java code. + *

The following atributes are supported: + *

+ *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class VarElementHandler extends ElementHandler { + private ValueObject value; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("idref")) { // NON-NLS: the attribute name + this.value = ValueObjectImpl.create(getVariable(value)); + } else { + super.addAttribute(name, value); + } + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected ValueObject getValueObject() { + if (this.value == null) { + throw new IllegalArgumentException("Variable name is not set"); + } + return this.value; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/decoder/VoidElementHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/decoder/VoidElementHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <void> element. + * This element looks like <object> element, + * but its value is not used as an argument for element + * that contains this one. + *

The following atributes are supported: + *

+ *
class + *
the type is used for static methods and fields + *
method + *
the method name + *
property + *
the property name + *
index + *
the property index + *
field + *
the field name + *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class VoidElementHandler extends ObjectElementHandler { + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return false; // hack for compatibility + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/AbstractFinder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/finder/AbstractFinder.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,213 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import java.util.HashMap; +import java.util.Map; + +/** + * This abstract class provides functionality + * to find a public method or constructor + * with specified parameter types. + * It supports a variable number of parameters. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +abstract class AbstractFinder { + private final Class[] args; + + /** + * Creates finder for array of classes of arguments. + * If a particular element of array equals {@code null}, + * than the appropriate pair of classes + * does not take into consideration. + * + * @param args array of classes of arguments + */ + protected AbstractFinder(Class[] args) { + this.args = args; + } + + /** + * Returns an array of {@code Class} objects + * that represent the formal parameter types of the method + * Returns an empty array if the method takes no parameters. + * + * @param method the object that represents method + * @return the parameter types of the method + */ + protected abstract Class[] getParameters(T method); + + /** + * Returns {@code true} if and only if the method + * was declared to take a variable number of arguments. + * + * @param method the object that represents method + * @return {@code true} if the method was declared + * to take a variable number of arguments; + * {@code false} otherwise + */ + protected abstract boolean isVarArgs(T method); + + /** + * Checks validness of the method. + * At least the valid method should be public. + * + * @param method the object that represents method + * @return {@code true} if the method is valid, + * {@code false} otherwise + */ + protected abstract boolean isValid(T method); + + /** + * Performs a search in the {@code methods} array. + * The one method is selected from the array of the valid methods. + * The list of parameters of the selected method shows + * the best correlation with the list of arguments + * specified at class initialization. + * If more than one method is both accessible and applicable + * to a method invocation, it is necessary to choose one + * to provide the descriptor for the run-time method dispatch. + * The most specific method should be chosen. + * + * @param methods the array of methods to search within + * @return the object that represents found method + * @throws NoSuchMethodException if no method was found or several + * methods meet the search criteria + * @see #isAssignable + */ + final T find(T[] methods) throws NoSuchMethodException { + Map[]> map = new HashMap[]>(); + + T oldMethod = null; + Class[] oldParams = null; + boolean ambiguous = false; + + for (T newMethod : methods) { + if (isValid(newMethod)) { + Class[] newParams = getParameters(newMethod); + if (newParams.length == this.args.length) { + PrimitiveWrapperMap.replacePrimitivesWithWrappers(newParams); + if (isAssignable(newParams, this.args)) { + if (oldMethod == null) { + oldMethod = newMethod; + oldParams = newParams; + } else { + boolean useNew = isAssignable(oldParams, newParams); + boolean useOld = isAssignable(newParams, oldParams); + + if (useOld == useNew) { + ambiguous = true; + } else if (useNew) { + oldMethod = newMethod; + oldParams = newParams; + ambiguous = false; + } + } + } + } + if (isVarArgs(newMethod)) { + int length = newParams.length - 1; + if (length <= this.args.length) { + Class[] array = new Class[this.args.length]; + System.arraycopy(newParams, 0, array, 0, length); + if (length < this.args.length) { + Class type = newParams[length].getComponentType(); + if (type.isPrimitive()) { + type = PrimitiveWrapperMap.getType(type.getName()); + } + for (int i = length; i < this.args.length; i++) { + array[i] = type; + } + } + map.put(newMethod, array); + } + } + } + } + for (T newMethod : methods) { + Class[] newParams = map.get(newMethod); + if (newParams != null) { + if (isAssignable(newParams, this.args)) { + if (oldMethod == null) { + oldMethod = newMethod; + oldParams = newParams; + } else { + boolean useNew = isAssignable(oldParams, newParams); + boolean useOld = isAssignable(newParams, oldParams); + + if (useOld == useNew) { + if (oldParams == map.get(oldMethod)) { + ambiguous = true; + } + } else if (useNew) { + oldMethod = newMethod; + oldParams = newParams; + ambiguous = false; + } + } + } + } + } + + if (ambiguous) { + throw new NoSuchMethodException("Ambiguous methods are found"); + } + if (oldMethod == null) { + throw new NoSuchMethodException("Method is not found"); + } + return oldMethod; + } + + /** + * Determines if every class in {@code min} array is either the same as, + * or is a superclass of, the corresponding class in {@code max} array. + * The length of every array must equal the number of arguments. + * This comparison is performed in the {@link #find} method + * before the first call of the isAssignable method. + * If an argument equals {@code null} + * the appropriate pair of classes does not take into consideration. + * + * @param min the array of classes to be checked + * @param max the array of classes that is used to check + * @return {@code true} if all classes in {@code min} array + * are assignable from corresponding classes in {@code max} array, + * {@code false} otherwise + * + * @see Class#isAssignableFrom + */ + private boolean isAssignable(Class[] min, Class[] max) { + for (int i = 0; i < this.args.length; i++) { + if (null != this.args[i]) { + if (!min[i].isAssignableFrom(max[i])) { + return false; + } + } + } + return true; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java --- a/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ package com.sun.beans.finder; /** - * This is utility class that provides static methods + * This is utility class that provides {@code static} methods * to find a class with the specified name using the specified class loader. * * @since 1.7 @@ -33,137 +33,138 @@ * @author Sergey A. Malenkov */ public final class ClassFinder { + /** - * Returns the Class object associated + * Returns the {@code Class} object associated * with the class or interface with the given string name, * using the default class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). * * @param name fully qualified name of the desired class * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see Class#forName(String) * @see Class#forName(String,boolean,ClassLoader) * @see ClassLoader#getSystemClassLoader() * @see Thread#getContextClassLoader() */ - public static Class findClass( String name ) throws ClassNotFoundException { + public static Class findClass(String name) throws ClassNotFoundException { try { ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if ( loader == null ) { + if (loader == null) { // can be null in IE (see 6204697) loader = ClassLoader.getSystemClassLoader(); } - if ( loader != null ) { - return Class.forName( name, false, loader ); + if (loader != null) { + return Class.forName(name, false, loader); } - } catch ( ClassNotFoundException exception ) { + } catch (ClassNotFoundException exception) { // use current class loader instead - } catch ( SecurityException exception ) { + } catch (SecurityException exception) { // use current class loader instead } - return Class.forName( name ); + return Class.forName(name); } /** - * Returns the Class object associated with + * Returns the {@code Class} object associated with * the class or interface with the given string name, * using the given class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). *

- * If the parameter loader is null, + * If the parameter {@code loader} is null, * the class is loaded through the default class loader. * * @param name fully qualified name of the desired class * @param loader class loader from which the class must be loaded * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see #findClass(String,ClassLoader) * @see Class#forName(String,boolean,ClassLoader) */ - public static Class findClass( String name, ClassLoader loader ) throws ClassNotFoundException { - if ( loader != null ) { + public static Class findClass(String name, ClassLoader loader) throws ClassNotFoundException { + if (loader != null) { try { - return Class.forName( name, false, loader ); - } catch ( ClassNotFoundException exception ) { + return Class.forName(name, false, loader); + } catch (ClassNotFoundException exception) { // use default class loader instead - } catch ( SecurityException exception ) { + } catch (SecurityException exception) { // use default class loader instead } } - return findClass( name ); + return findClass(name); } /** - * Returns the Class object associated + * Returns the {@code Class} object associated * with the class or interface with the given string name, * using the default class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). *

* This method can be used to obtain - * any of the Class objects - * representing void or primitive Java types: - * char, byte, short, - * int, long, float, - * double and boolean. + * any of the {@code Class} objects + * representing {@code void} or primitive Java types: + * {@code char}, {@code byte}, {@code short}, + * {@code int}, {@code long}, {@code float}, + * {@code double} and {@code boolean}. * * @param name fully qualified name of the desired class * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see #resolveClass(String,ClassLoader) */ - public static Class resolveClass( String name ) throws ClassNotFoundException { - return resolveClass( name, null ); + public static Class resolveClass(String name) throws ClassNotFoundException { + return resolveClass(name, null); } /** - * Returns the Class object associated with + * Returns the {@code Class} object associated with * the class or interface with the given string name, * using the given class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). *

- * If the parameter loader is null, + * If the parameter {@code loader} is null, * the class is loaded through the default class loader. *

* This method can be used to obtain - * any of the Class objects - * representing void or primitive Java types: - * char, byte, short, - * int, long, float, - * double and boolean. + * any of the {@code Class} objects + * representing {@code void} or primitive Java types: + * {@code char}, {@code byte}, {@code short}, + * {@code int}, {@code long}, {@code float}, + * {@code double} and {@code boolean}. * * @param name fully qualified name of the desired class * @param loader class loader from which the class must be loaded * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see #findClass(String,ClassLoader) * @see PrimitiveTypeMap#getType(String) */ - public static Class resolveClass( String name, ClassLoader loader ) throws ClassNotFoundException { - Class type = PrimitiveTypeMap.getType( name ); - return ( type == null ) - ? findClass( name, loader ) + public static Class resolveClass(String name, ClassLoader loader) throws ClassNotFoundException { + Class type = PrimitiveTypeMap.getType(name); + return (type == null) + ? findClass(name, loader) : type; } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/ConstructorFinder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/finder/ConstructorFinder.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,127 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import com.sun.beans.WeakCache; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; + +/** + * This utility class provides {@code static} methods + * to find a public constructor with specified parameter types + * in specified class. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class ConstructorFinder extends AbstractFinder> { + private static final WeakCache> CACHE = new WeakCache>(); + + /** + * Finds public constructor + * that is declared in public class. + * + * @param type the class that can have constructor + * @param args parameter types that is used to find constructor + * @return object that represents found constructor + * @throws NoSuchMethodException if constructor could not be found + * or some constructors are found + */ + public static Constructor findConstructor(Class type, Class...args) throws NoSuchMethodException { + if (type.isPrimitive()) { + throw new NoSuchMethodException("Primitive wrapper does not contain constructors"); + } + if (type.isInterface()) { + throw new NoSuchMethodException("Interface does not contain constructors"); + } + if (Modifier.isAbstract(type.getModifiers())) { + throw new NoSuchMethodException("Abstract class cannot be instantiated"); + } + if (!Modifier.isPublic(type.getModifiers())) { + throw new NoSuchMethodException("Class is not accessible"); + } + PrimitiveWrapperMap.replacePrimitivesWithWrappers(args); + Signature signature = new Signature(type, args); + + Constructor constructor = CACHE.get(signature); + if (constructor != null) { + return constructor; + } + constructor = new ConstructorFinder(args).find(type.getConstructors()); + CACHE.put(signature, constructor); + return constructor; + } + + /** + * Creates constructor finder with specified array of parameter types. + * + * @param args the array of parameter types + */ + private ConstructorFinder(Class[] args) { + super(args); + } + + /** + * Returns an array of {@code Class} objects + * that represent the formal parameter types of the constructor + * Returns an empty array if the constructor takes no parameters. + * + * @param constructor the object that represents constructor + * @return the parameter types of the constructor + */ + @Override + protected Class[] getParameters(Constructor constructor) { + return constructor.getParameterTypes(); + } + + /** + * Returns {@code true} if and only if the constructor + * was declared to take a variable number of arguments. + * + * @param constructor the object that represents constructor + * @return {@code true} if the constructor was declared + * to take a variable number of arguments; + * {@code false} otherwise + */ + @Override + protected boolean isVarArgs(Constructor constructor) { + return constructor.isVarArgs(); + } + + /** + * Checks validness of the constructor. + * The valid constructor should be public. + * + * @param constructor the object that represents constructor + * @return {@code true} if the constructor is valid, + * {@code false} otherwise + */ + @Override + protected boolean isValid(Constructor constructor) { + return Modifier.isPublic(constructor.getModifiers()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/FieldFinder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/finder/FieldFinder.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,106 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +/** + * This utility class provides {@code static} methods + * to find a public field with specified name + * in specified class. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class FieldFinder { + + /** + * Finds public field (static or non-static) + * that is declared in public class. + * + * @param type the class that can have field + * @param name the name of field to find + * @return object that represents found field + * @throws NoSuchFieldException if field is not found + * @see Class#getField + */ + public static Field findField(Class type, String name) throws NoSuchFieldException { + if (name == null) { + throw new IllegalArgumentException("Field name is not set"); + } + Field field = type.getField(name); + if (!Modifier.isPublic(field.getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is not public"); + } + if (!Modifier.isPublic(field.getDeclaringClass().getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is not accessible"); + } + return field; + } + + /** + * Finds public non-static field + * that is declared in public class. + * + * @param type the class that can have field + * @param name the name of field to find + * @return object that represents found field + * @throws NoSuchFieldException if field is not found + * @see Class#getField + */ + public static Field findInstanceField(Class type, String name) throws NoSuchFieldException { + Field field = findField(type, name); + if (Modifier.isStatic(field.getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is static"); + } + return field; + } + + /** + * Finds public static field + * that is declared in public class. + * + * @param type the class that can have field + * @param name the name of field to find + * @return object that represents found field + * @throws NoSuchFieldException if field is not found + * @see Class#getField + */ + public static Field findStaticField(Class type, String name) throws NoSuchFieldException { + Field field = findField(type, name); + if (!Modifier.isStatic(field.getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is not static"); + } + return field; + } + + /** + * Disable instantiation. + */ + private FieldFinder() { + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/MethodFinder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/finder/MethodFinder.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,231 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import com.sun.beans.TypeResolver; +import com.sun.beans.WeakCache; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; + +/** + * This utility class provides {@code static} methods + * to find a public method with specified name and parameter types + * in specified class. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class MethodFinder extends AbstractFinder { + private static final WeakCache CACHE = new WeakCache(); + + /** + * Finds public method (static or non-static) + * that is accessible from public class. + * + * @param type the class that can have method + * @param name the name of method to find + * @param args parameter types that is used to find method + * @return object that represents found method + * @throws NoSuchMethodException if method could not be found + * or some methods are found + */ + public static Method findMethod(Class type, String name, Class...args) throws NoSuchMethodException { + if (name == null) { + throw new IllegalArgumentException("Method name is not set"); + } + PrimitiveWrapperMap.replacePrimitivesWithWrappers(args); + Signature signature = new Signature(type, name, args); + + Method method = CACHE.get(signature); + if (method != null) { + return method; + } + method = findAccessibleMethod(new MethodFinder(name, args).find(type.getMethods())); + CACHE.put(signature, method); + return method; + } + + /** + * Finds public non-static method + * that is accessible from public class. + * + * @param type the class that can have method + * @param name the name of method to find + * @param args parameter types that is used to find method + * @return object that represents found method + * @throws NoSuchMethodException if method could not be found + * or some methods are found + */ + public static Method findInstanceMethod(Class type, String name, Class... args) throws NoSuchMethodException { + Method method = findMethod(type, name, args); + if (Modifier.isStatic(method.getModifiers())) { + throw new NoSuchMethodException("Method '" + name + "' is static"); + } + return method; + } + + /** + * Finds public static method + * that is accessible from public class. + * + * @param type the class that can have method + * @param name the name of method to find + * @param args parameter types that is used to find method + * @return object that represents found method + * @throws NoSuchMethodException if method could not be found + * or some methods are found + */ + public static Method findStaticMethod(Class type, String name, Class...args) throws NoSuchMethodException { + Method method = findMethod(type, name, args); + if (!Modifier.isStatic(method.getModifiers())) { + throw new NoSuchMethodException("Method '" + name + "' is not static"); + } + return method; + } + + /** + * Finds method that is accessible from public class or interface through class hierarchy. + * + * @param method object that represents found method + * @return object that represents accessible method + * @throws NoSuchMethodException if method is not accessible or is not found + * in specified superclass or interface + */ + private static Method findAccessibleMethod(Method method) throws NoSuchMethodException { + Class type = method.getDeclaringClass(); + if (Modifier.isPublic(type.getModifiers())) { + return method; + } + if (Modifier.isStatic(method.getModifiers())) { + throw new NoSuchMethodException("Method '" + method.getName() + "' is not accessible"); + } + for (Type generic : type.getGenericInterfaces()) { + try { + return findAccessibleMethod(method, generic); + } + catch (NoSuchMethodException exception) { + // try to find in superclass or another interface + } + } + return findAccessibleMethod(method, type.getGenericSuperclass()); + } + + /** + * Finds method that accessible from specified class. + * + * @param method object that represents found method + * @param generic generic type that is used to find accessible method + * @return object that represents accessible method + * @throws NoSuchMethodException if method is not accessible or is not found + * in specified superclass or interface + */ + private static Method findAccessibleMethod(Method method, Type generic) throws NoSuchMethodException { + String name = method.getName(); + Class[] params = method.getParameterTypes(); + if (generic instanceof Class) { + Class type = (Class) generic; + return findAccessibleMethod(type.getMethod(name, params)); + } + if (generic instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) generic; + Class type = (Class) pt.getRawType(); + for (Method m : type.getMethods()) { + if (m.getName().equals(name)) { + Class[] pts = m.getParameterTypes(); + if (pts.length == params.length) { + if (Arrays.equals(params, pts)) { + return findAccessibleMethod(m); + } + Type[] gpts = m.getGenericParameterTypes(); + if (Arrays.equals(params, TypeResolver.erase(TypeResolver.resolve(pt, gpts)))) { + return findAccessibleMethod(m); + } + } + } + } + } + throw new NoSuchMethodException("Method '" + name + "' is not accessible"); + } + + + private final String name; + + /** + * Creates method finder with specified array of parameter types. + * + * @param name the name of method to find + * @param args the array of parameter types + */ + private MethodFinder(String name, Class[] args) { + super(args); + this.name = name; + } + + /** + * Returns an array of {@code Class} objects + * that represent the formal parameter types of the method + * Returns an empty array if the method takes no parameters. + * + * @param method the object that represents method + * @return the parameter types of the method + */ + @Override + protected Class[] getParameters(Method method) { + return method.getParameterTypes(); + } + + /** + * Returns {@code true} if and only if the method + * was declared to take a variable number of arguments. + * + * @param method the object that represents method + * @return {@code true} if the method was declared + * to take a variable number of arguments; + * {@code false} otherwise + */ + @Override + protected boolean isVarArgs(Method method) { + return method.isVarArgs(); + } + + /** + * Checks validness of the method. + * The valid method should be public and + * should have the specified name. + * + * @param method the object that represents method + * @return {@code true} if the method is valid, + * {@code false} otherwise + */ + @Override + protected boolean isValid(Method method) { + return Modifier.isPublic(method.getModifiers()) && method.getName().equals(this.name); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/PrimitiveTypeMap.java --- a/jdk/src/share/classes/com/sun/beans/finder/PrimitiveTypeMap.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/beans/finder/PrimitiveTypeMap.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,29 +36,30 @@ * @author Sergey A. Malenkov */ final class PrimitiveTypeMap { + /** * Returns primitive type class by its name. * * @param name the name of primitive type * @return found primitive type class, - * or null if not found + * or {@code null} if not found */ - static Class getType( String name ) { - return map.get( name ); + static Class getType(String name) { + return map.get(name); } - private static final Map map = new HashMap( 9 ); + private static final Map> map = new HashMap>(9); static { - map.put( boolean.class.getName(), boolean.class ); - map.put( char.class.getName(), char.class ); - map.put( byte.class.getName(), byte.class ); - map.put( short.class.getName(), short.class ); - map.put( int.class.getName(), int.class ); - map.put( long.class.getName(), long.class ); - map.put( float.class.getName(), float.class ); - map.put( double.class.getName(), double.class ); - map.put( void.class.getName(), void.class ); + map.put(boolean.class.getName(), boolean.class); + map.put(char.class.getName(), char.class); + map.put(byte.class.getName(), byte.class); + map.put(short.class.getName(), short.class); + map.put(int.class.getName(), int.class); + map.put(long.class.getName(), long.class); + map.put(float.class.getName(), float.class); + map.put(double.class.getName(), double.class); + map.put(void.class.getName(), void.class); } /** diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/PrimitiveWrapperMap.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/finder/PrimitiveWrapperMap.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,86 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import java.util.HashMap; +import java.util.Map; + +/** + * This utility class associates + * name of primitive type with appropriate wrapper. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class PrimitiveWrapperMap { + + /** + * Replaces all primitive types in specified array with wrappers. + * + * @param types array of classes where all primitive types + * will be replaced by appropriate wrappers + */ + static void replacePrimitivesWithWrappers(Class[] types) { + for (int i = 0; i < types.length; i++) { + if (types[i] != null) { + if (types[i].isPrimitive()) { + types[i] = getType(types[i].getName()); + } + } + } + } + + /** + * Returns wrapper for primitive type by its name. + * + * @param name the name of primitive type + * @return found wrapper for primitive type, + * or {@code null} if not found + */ + public static Class getType(String name) { + return map.get(name); + } + + private static final Map> map = new HashMap>(9); + + static { + map.put(Boolean.TYPE.getName(), Boolean.class); + map.put(Character.TYPE.getName(), Character.class); + map.put(Byte.TYPE.getName(), Byte.class); + map.put(Short.TYPE.getName(), Short.class); + map.put(Integer.TYPE.getName(), Integer.class); + map.put(Long.TYPE.getName(), Long.class); + map.put(Float.TYPE.getName(), Float.class); + map.put(Double.TYPE.getName(), Double.class); + map.put(Void.TYPE.getName(), Void.class); + } + + /** + * Disable instantiation. + */ + private PrimitiveWrapperMap() { + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/beans/finder/Signature.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/beans/finder/Signature.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,169 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +/** + * This class is designed to be a key of a cache + * of constructors or methods. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class Signature { + private final Class type; + private final String name; + private final Class[] args; + + private volatile int code; + + /** + * Constructs signature for constructor. + * + * @param type the class that contains constructor + * @param args the types of constructor's parameters + */ + Signature(Class type, Class[] args) { + this(type, null, args); + } + + /** + * Constructs signature for method. + * + * @param type the class that contains method + * @param name the name of the method + * @param args the types of method's parameters + */ + Signature(Class type, String name, Class[] args) { + this.type = type; + this.name = name; + this.args = args; + } + + /** + * Indicates whether some other object is "equal to" this one. + * + * @param object the reference object with which to compare + * @return {@code true} if this object is the same as the + * {@code object} argument, {@code false} otherwise + * @see #hashCode() + */ + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + if (object instanceof Signature) { + Signature signature = (Signature) object; + return isEqual(signature.type, this.type) + && isEqual(signature.name, this.name) + && isEqual(signature.args, this.args); + } + return false; + } + + /** + * Indicates whether some object is "equal to" another one. + * This method supports {@code null} values. + * + * @param obj1 the first reference object that will compared + * @param obj2 the second reference object that will compared + * @return {@code true} if first object is the same as the second object, + * {@code false} otherwise + */ + private static boolean isEqual(Object obj1, Object obj2) { + return (obj1 == null) + ? obj2 == null + : obj1.equals(obj2); + } + + /** + * Indicates whether some array is "equal to" another one. + * This method supports {@code null} values. + * + * @param args1 the first reference array that will compared + * @param args2 the second reference array that will compared + * @return {@code true} if first array is the same as the second array, + * {@code false} otherwise + */ + private static boolean isEqual(Class[] args1, Class[] args2) { + if ((args1 == null) || (args2 == null)) { + return args1 == args2; + } + if (args1.length != args2.length) { + return false; + } + for (int i = 0; i < args1.length; i++) { + if (!isEqual(args1[i], args2[i])) { + return false; + } + } + return true; + } + + /** + * Returns a hash code value for the object. + * This method is supported for the benefit of hashtables + * such as {@link java.util.HashMap} or {@link java.util.HashSet}. + * Hash code computed using algorithm + * suggested in Effective Java, Item 8. + * + * @return a hash code value for this object + * @see #equals(Object) + */ + @Override + public int hashCode() { + if (this.code == 0) { + int code = 17; + code = addHashCode(code, this.type); + code = addHashCode(code, this.name); + + if (this.args != null) { + for (Class arg : this.args) { + code = addHashCode(code, arg); + } + } + this.code = code; + } + return this.code; + } + + /** + * Adds hash code value if specified object. + * This is a part of the algorithm + * suggested in Effective Java, Item 8. + * + * @param code current hash code value + * @param object object that updates hash code value + * @return updated hash code value + * @see #hashCode() + */ + private static int addHashCode(int code, Object object) { + code *= 37; + return (object != null) + ? code + object.hashCode() + : code; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java Thu Feb 05 09:24:45 2009 -0800 @@ -799,9 +799,9 @@ Graphics g = triangleImage.getGraphics(); g.setColor(new Color(0, 0, 0, 0)); g.fillRect(0, 0, a, a); - g.translate((int)(a / 2), 0); + g.translate(a / 2, 0); paintTriangle(g, triangleSize, getColor()); - g.translate((int)(-a / 2), 0); + g.translate(-a / 2, 0); g.dispose(); g = wheelImage.getGraphics(); @@ -897,7 +897,7 @@ return false; } // Rotate to origin and and verify x is valid. - int triangleSize = (int)innerR * 3 / 2; + int triangleSize = innerR * 3 / 2; double x1 = Math.cos(angle) * x - Math.sin(angle) * y; double y1 = Math.sin(angle) * x + Math.cos(angle) * y; if (x1 < -(innerR / 2)) { @@ -960,7 +960,7 @@ */ private void setSaturationAndBrightness(float s, float b) { int innerR = getTriangleCircumscribedRadius(); - int triangleSize = (int)innerR * 3 / 2; + int triangleSize = innerR * 3 / 2; double x = b * triangleSize; double maxY = x * Math.tan(Math.toRadians(30.0)); double y = 2 * maxY * s - maxY; @@ -1156,7 +1156,7 @@ * @param x X location to get color for * @param y Y location to get color for * @param rad Radius from center of color wheel - * @param integer with red, green and blue components + * @return integer with red, green and blue components */ private int colorWheelLocationToRGB(int x, int y, double rad) { double angle = Math.acos((double)x / rad); @@ -1165,12 +1165,12 @@ if (angle < PI_3) { if (y < 0) { // FFFF00 - FF0000 - rgb = 0xFF0000 | (int)Math.min(255, + rgb = 0xFF0000 | Math.min(255, (int)(255 * angle / PI_3)) << 8; } else { // FF0000 - FF00FF - rgb = 0xFF0000 | (int)Math.min(255, + rgb = 0xFF0000 | Math.min(255, (int)(255 * angle / PI_3)); } } @@ -1178,12 +1178,12 @@ angle -= PI_3; if (y < 0) { // 00FF00 - FFFF00 - rgb = 0x00FF00 | (int)Math.max(0, 255 - + rgb = 0x00FF00 | Math.max(0, 255 - (int)(255 * angle / PI_3)) << 16; } else { // FF00FF - 0000FF - rgb = 0x0000FF | (int)Math.max(0, 255 - + rgb = 0x0000FF | Math.max(0, 255 - (int)(255 * angle / PI_3)) << 16; } } @@ -1191,12 +1191,12 @@ angle -= 2 * PI_3; if (y < 0) { // 00FFFF - 00FF00 - rgb = 0x00FF00 | (int)Math.min(255, + rgb = 0x00FF00 | Math.min(255, (int)(255 * angle / PI_3)); } else { // 0000FF - 00FFFF - rgb = 0x0000FF | (int)Math.min(255, + rgb = 0x0000FF | Math.min(255, (int)(255 * angle / PI_3)) << 8; } } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java Thu Feb 05 09:24:45 2009 -0800 @@ -112,7 +112,7 @@ } - private static HashMap regionToWidgetTypeMap; + private static HashMap regionToWidgetTypeMap; private ImageCache cache = new ImageCache(CACHE_SIZE); private int x0, y0, w0, h0; private Graphics graphics; @@ -178,7 +178,7 @@ Toolkit.getDefaultToolkit(); // Initialize regionToWidgetTypeMap - regionToWidgetTypeMap = new HashMap(50); + regionToWidgetTypeMap = new HashMap(50); regionToWidgetTypeMap.put(Region.ARROW_BUTTON, new WidgetType[] { WidgetType.SPINNER_ARROW_BUTTON, WidgetType.COMBO_BOX_ARROW_BUTTON, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Thu Feb 05 09:24:45 2009 -0800 @@ -148,7 +148,7 @@ directoryList : fileList; Object[] files = list.getSelectedValues(); int len = files.length; - Vector result = new Vector(len + 1); + Vector result = new Vector(len + 1); // we return all selected file names for (int i = 0; i < len; i++) { @@ -263,13 +263,13 @@ ListSelectionModel sm = directoryList.getSelectionModel(); if (sm instanceof DefaultListSelectionModel) { ((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); - ((DefaultListSelectionModel)sm).setAnchorSelectionIndex(0); + sm.setAnchorSelectionIndex(0); } fileList.clearSelection(); sm = fileList.getSelectionModel(); if (sm instanceof DefaultListSelectionModel) { ((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); - ((DefaultListSelectionModel)sm).setAnchorSelectionIndex(0); + sm.setAnchorSelectionIndex(0); } File currentDirectory = getFileChooser().getCurrentDirectory(); @@ -425,16 +425,16 @@ setDirectorySelected(true); setDirectory(((File)objects[0])); } else { - ArrayList fList = new ArrayList(objects.length); - for (int i = 0; i < objects.length; i++) { - File f = (File)objects[i]; + ArrayList fList = new ArrayList(objects.length); + for (Object object : objects) { + File f = (File) object; if ((chooser.isFileSelectionEnabled() && f.isFile()) || (chooser.isDirectorySelectionEnabled() && f.isDirectory())) { fList.add(f); } } if (fList.size() > 0) { - files = (File[])fList.toArray(new File[fList.size()]); + files = fList.toArray(new File[fList.size()]); } setDirectorySelected(false); } @@ -671,9 +671,9 @@ pathFieldLabel.setLabelFor(fileNameTextField); - Set forwardTraversalKeys = fileNameTextField.getFocusTraversalKeys( + Set forwardTraversalKeys = fileNameTextField.getFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); - forwardTraversalKeys = new HashSet(forwardTraversalKeys); + forwardTraversalKeys = new HashSet(forwardTraversalKeys); forwardTraversalKeys.remove(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0)); fileNameTextField.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardTraversalKeys); @@ -895,10 +895,9 @@ private class GTKDirectoryModel extends BasicDirectoryModel { FileSystemView fsv; - private Comparator fileComparator = new Comparator() { - public int compare(Object o, Object o1) { - return fsv.getSystemDisplayName((File) o).compareTo - (fsv.getSystemDisplayName((File) o1)); + private Comparator fileComparator = new Comparator() { + public int compare(File o, File o1) { + return fsv.getSystemDisplayName(o).compareTo(fsv.getSystemDisplayName(o1)); } }; @@ -1074,7 +1073,7 @@ * Data model for a type-face selection combo-box. */ protected class DirectoryComboBoxModel extends AbstractListModel implements ComboBoxModel { - Vector directories = new Vector(); + Vector directories = new Vector(); File selectedDirectory = null; JFileChooser chooser = getFileChooser(); FileSystemView fsv = chooser.getFileSystemView(); @@ -1216,7 +1215,7 @@ ListSelectionModel sm = fileList.getSelectionModel(); if (sm instanceof DefaultListSelectionModel) { ((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); - ((DefaultListSelectionModel)sm).setAnchorSelectionIndex(0); + sm.setAnchorSelectionIndex(0); } rescanCurrentDirectory(getFileChooser()); return; @@ -1352,8 +1351,8 @@ FileFilter currentFilter = getFileChooser().getFileFilter(); boolean found = false; if (currentFilter != null) { - for (int i = 0; i < filters.length; i++) { - if (filters[i] == currentFilter) { + for (FileFilter filter : filters) { + if (filter == currentFilter) { found = true; } } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Thu Feb 05 09:24:45 2009 -0800 @@ -1470,7 +1470,7 @@ aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(gtkAAFontSettingsCond); } - static ReferenceQueue queue = new ReferenceQueue(); + static ReferenceQueue queue = new ReferenceQueue(); private static void flushUnreferenced() { WeakPCL pcl; @@ -1480,12 +1480,12 @@ } } - static class WeakPCL extends WeakReference implements + static class WeakPCL extends WeakReference implements PropertyChangeListener { private Toolkit kit; private String key; - WeakPCL(Object target, Toolkit kit, String key) { + WeakPCL(GTKLookAndFeel target, Toolkit kit, String key) { super(target, queue); this.kit = kit; this.key = key; @@ -1494,7 +1494,7 @@ public String getKey() { return key; } public void propertyChange(final PropertyChangeEvent pce) { - final GTKLookAndFeel lnf = (GTKLookAndFeel)get(); + final GTKLookAndFeel lnf = get(); if (lnf == null || UIManager.getLookAndFeel() != lnf) { // The property was GC'ed, we're no longer interested in diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java Thu Feb 05 09:24:45 2009 -0800 @@ -299,7 +299,7 @@ // Paint the default indicator GTKStyle style = (GTKStyle)context.getStyle(); if (defaultCapable && !toolButton) { - Insets defaultInsets = (Insets)style.getClassSpecificInsetsValue( + Insets defaultInsets = style.getClassSpecificInsetsValue( context, "default-border", GTKStyle.BUTTON_DEFAULT_BORDER_INSETS); diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java Thu Feb 05 09:24:45 2009 -0800 @@ -124,7 +124,7 @@ } // Initialize constants - variables = new HashMap(); + variables = new HashMap(); NodeList nodes = xmlDoc.getElementsByTagName("constant"); int n = nodes.getLength(); for (int i = 0; i < n; i++) { @@ -144,14 +144,14 @@ } // Cache frame geometries - frameGeometries = new HashMap(); + frameGeometries = new HashMap>(); nodes = xmlDoc.getElementsByTagName("frame_geometry"); n = nodes.getLength(); for (int i = 0; i < n; i++) { Node node = nodes.item(i); String name = getStringAttr(node, "name"); if (name != null) { - HashMap gm = new HashMap(); + HashMap gm = new HashMap(); frameGeometries.put(name, gm); String parentGM = getStringAttr(node, "parent"); @@ -458,7 +458,7 @@ - private static class Privileged implements PrivilegedAction { + private static class Privileged implements PrivilegedAction { private static int GET_THEME_DIR = 0; private static int GET_USER_THEME = 1; private static int GET_IMAGE = 2; @@ -598,7 +598,7 @@ g2.setComposite(oldComp); } - private HashMap images = new HashMap(); + private HashMap images = new HashMap(); protected Image getImage(String key, Color c) { Image image = images.get(key+"-"+c.getRGB()); @@ -1530,8 +1530,8 @@ DocumentBuilderFactory.newInstance().newDocumentBuilder(); } InputStream inputStream = - (InputStream)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { + AccessController.doPrivileged(new PrivilegedAction() { + public InputStream run() { try { return new BufferedInputStream(xmlFile.openStream()); } catch (IOException ex) { @@ -1551,7 +1551,7 @@ protected Node[] getNodesByName(Node parent, String name) { NodeList nodes = parent.getChildNodes(); // ElementNode int n = nodes.getLength(); - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList(); for (int i=0; i < n; i++) { Node node = nodes.item(i); if (name.equals(node.getNodeName())) { @@ -1603,7 +1603,7 @@ String aValue = attrs[a * 2 + 1]; Node attr = nodeAttrs.getNamedItem(aName); if (attr == null || - aValue != null && !aValue.equals((String)attr.getNodeValue())) { + aValue != null && !aValue.equals(attr.getNodeValue())) { matches = false; break; } @@ -1642,7 +1642,7 @@ protected String getStringAttr(NamedNodeMap attrs, String name) { Node item = attrs.getNamedItem(name); - return (item != null) ? (String)item.getNodeValue() : null; + return (item != null) ? item.getNodeValue() : null; } protected boolean getBooleanAttr(Node node, String name, boolean fallback) { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Thu Feb 05 09:24:45 2009 -0800 @@ -70,7 +70,6 @@ private JTextField filenameTextField; private FilePane filePane; private WindowsPlacesBar placesBar; - private boolean useShellFolder; private JButton approveButton; private JButton cancelButton; @@ -210,10 +209,6 @@ public ListSelectionListener createListSelectionListener() { return WindowsFileChooserUI.this.createListSelectionListener(getFileChooser()); } - - public boolean usesShellFolder() { - return useShellFolder; - } } public void installComponents(JFileChooser fc) { @@ -625,15 +620,8 @@ // Decide whether to use the ShellFolder class to populate shortcut // panel and combobox. JFileChooser fc = getFileChooser(); - Boolean prop = - (Boolean)fc.getClientProperty("FileChooser.useShellFolder"); - if (prop != null) { - useShellFolder = prop.booleanValue(); - } else { - useShellFolder = fc.getFileSystemView().equals(FileSystemView.getFileSystemView()); - } if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) >= 0) { - if (useShellFolder) { + if (FilePane.usesShellFolder(fc)) { if (placesBar == null && !UIManager.getBoolean("FileChooser.noPlacesBar")) { placesBar = new WindowsPlacesBar(fc, XPStyle.getXP() != null); fc.add(placesBar, BorderLayout.BEFORE_LINE_BEGINS); @@ -1149,6 +1137,8 @@ return; } + boolean useShellFolder = FilePane.usesShellFolder(chooser); + directories.clear(); File[] baseFolders; diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java Thu Feb 05 09:24:45 2009 -0800 @@ -1554,10 +1554,10 @@ "Tree.selectionBackground", SelectionBackgroundColor, "Tree.expandedIcon", treeExpandedIcon, "Tree.collapsedIcon", treeCollapsedIcon, - "Tree.openIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", "shell32Icon 5", - (Icon)table.get("Tree.openIcon")), - "Tree.closedIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", "shell32Icon 4", - (Icon)table.get("Tree.closedIcon")), + "Tree.openIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", + "shell32Icon 5", "icons/TreeOpen.gif"), + "Tree.closedIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", + "shell32Icon 4", "icons/TreeClosed.gif"), "Tree.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { "ADD", "expand", @@ -2205,21 +2205,21 @@ */ private class ActiveWindowsIcon implements UIDefaults.ActiveValue { private Icon icon; - private Icon fallback; private String nativeImageName; + private String fallbackName; private DesktopProperty desktopProperty; ActiveWindowsIcon(String desktopPropertyName, - String nativeImageName, Icon fallback) { + String nativeImageName, String fallbackName) { this.nativeImageName = nativeImageName; - this.fallback = fallback; + this.fallbackName = fallbackName; if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS && OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) < 0) { // This desktop property is needed to trigger reloading the icon. // It is kept in member variable to avoid GC. this.desktopProperty = new TriggerDesktopProperty(desktopPropertyName) { - protected void updateUI() { + @Override protected void updateUI() { icon = null; super.updateUI(); } @@ -2227,6 +2227,7 @@ } } + @Override public Object createValue(UIDefaults table) { if (icon == null) { Image image = (Image)ShellFolder.get(nativeImageName); @@ -2234,8 +2235,11 @@ icon = new ImageIconUIResource(image); } } - if (icon == null && fallback != null) { - icon = fallback; + if (icon == null && fallbackName != null) { + UIDefaults.LazyValue fallback = (UIDefaults.LazyValue) + SwingUtilities2.makeIcon(WindowsLookAndFeel.class, + BasicLookAndFeel.class, fallbackName); + icon = (Icon) fallback.createValue(table); } return icon; } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java --- a/jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java Thu Feb 05 09:24:45 2009 -0800 @@ -75,13 +75,6 @@ /** * This is the device handle returned from native code */ - /* - * $$rratta Solaris 64 bit holds pointer must be long - * - * $$mp 2003-08-07: - * 'id' is a really bad name. The variable should - * be called nativePointer or something similar. - */ protected long id = 0; @@ -586,7 +579,6 @@ private ArrayList transmitters = new ArrayList(); private MidiOutDevice.MidiOutReceiver midiOutReceiver; - private MixerSynth.SynthReceiver mixerSynthReceiver; // how many transmitters must be present for optimized // handling @@ -621,22 +613,14 @@ if (midiOutReceiver == oldR) { midiOutReceiver = null; } - if (mixerSynthReceiver == oldR) { - mixerSynthReceiver = null; - } if (newR != null) { if ((newR instanceof MidiOutDevice.MidiOutReceiver) && (midiOutReceiver == null)) { midiOutReceiver = ((MidiOutDevice.MidiOutReceiver) newR); } - if ((newR instanceof MixerSynth.SynthReceiver) - && (mixerSynthReceiver == null)) { - mixerSynthReceiver = ((MixerSynth.SynthReceiver) newR); - } } optimizedReceiverCount = - ((midiOutReceiver!=null)?1:0) - + ((mixerSynthReceiver!=null)?1:0); + ((midiOutReceiver!=null)?1:0); } // more potential for optimization here } @@ -670,10 +654,6 @@ if (TRACE_TRANSMITTER) Printer.println("Sending packed message to MidiOutReceiver"); midiOutReceiver.sendPackedMidiMessage(packedMessage, timeStamp); } - if (mixerSynthReceiver != null) { - if (TRACE_TRANSMITTER) Printer.println("Sending packed message to MixerSynthReceiver"); - mixerSynthReceiver.sendPackedMidiMessage(packedMessage, timeStamp); - } } else { if (TRACE_TRANSMITTER) Printer.println("Sending packed message to "+size+" transmitter's receivers"); for (int i = 0; i < size; i++) { @@ -682,9 +662,6 @@ if (optimizedReceiverCount > 0) { if (receiver instanceof MidiOutDevice.MidiOutReceiver) { ((MidiOutDevice.MidiOutReceiver) receiver).sendPackedMidiMessage(packedMessage, timeStamp); - } - else if (receiver instanceof MixerSynth.SynthReceiver) { - ((MixerSynth.SynthReceiver) receiver).sendPackedMidiMessage(packedMessage, timeStamp); } else { receiver.send(new FastShortMessage(packedMessage), timeStamp); } @@ -739,10 +716,6 @@ if (TRACE_TRANSMITTER) Printer.println("Sending MIDI message to MidiOutReceiver"); midiOutReceiver.send(message, timeStamp); } - if (mixerSynthReceiver != null) { - if (TRACE_TRANSMITTER) Printer.println("Sending MIDI message to MixerSynthReceiver"); - mixerSynthReceiver.send(message, timeStamp); - } } else { if (TRACE_TRANSMITTER) Printer.println("Sending MIDI message to "+size+" transmitter's receivers"); for (int i = 0; i < size; i++) { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,131 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; + +/** + * Soundbank reader that uses audio files as soundbanks. + * + * @author Karl Helgason + */ +public class AudioFileSoundbankReader extends SoundbankReader { + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + try { + AudioInputStream ais = AudioSystem.getAudioInputStream(url); + Soundbank sbk = getSoundbank(ais); + ais.close(); + return sbk; + } catch (UnsupportedAudioFileException e) { + return null; + } catch (IOException e) { + return null; + } + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + stream.mark(512); + try { + AudioInputStream ais = AudioSystem.getAudioInputStream(stream); + Soundbank sbk = getSoundbank(ais); + if (sbk != null) + return sbk; + } catch (UnsupportedAudioFileException e) { + } catch (IOException e) { + } + stream.reset(); + return null; + } + + public Soundbank getSoundbank(AudioInputStream ais) + throws InvalidMidiDataException, IOException { + try { + byte[] buffer; + if (ais.getFrameLength() == -1) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buff = new byte[1024 + - (1024 % ais.getFormat().getFrameSize())]; + int ret; + while ((ret = ais.read(buff)) != -1) { + baos.write(buff, 0, ret); + } + ais.close(); + buffer = baos.toByteArray(); + } else { + buffer = new byte[(int) (ais.getFrameLength() + * ais.getFormat().getFrameSize())]; + new DataInputStream(ais).readFully(buffer); + } + ModelByteBufferWavetable osc = new ModelByteBufferWavetable( + new ModelByteBuffer(buffer), ais.getFormat(), -4800); + ModelPerformer performer = new ModelPerformer(); + performer.getOscillators().add(osc); + + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.add(performer); + sbk.addInstrument(ins); + return sbk; + } catch (Exception e) { + return null; + } + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + try { + AudioInputStream ais = AudioSystem.getAudioInputStream(file); + ais.close(); + ModelByteBufferWavetable osc = new ModelByteBufferWavetable( + new ModelByteBuffer(file, 0, file.length()), -4800); + ModelPerformer performer = new ModelPerformer(); + performer.getOscillators().add(osc); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.add(performer); + sbk.addInstrument(ins); + return sbk; + } catch (UnsupportedAudioFileException e1) { + return null; + } catch (IOException e) { + return null; + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/AudioFloatConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFloatConverter.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,1058 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioFormat.Encoding; + +/** + * This class is used to convert between 8,16,24,32,32+ bit signed/unsigned + * big/litle endian fixed/floating point byte buffers and float buffers. + * + * @author Karl Helgason + */ +public abstract class AudioFloatConverter { + + public static final Encoding PCM_FLOAT = new Encoding("PCM_FLOAT"); + + /*************************************************************************** + * + * LSB Filter, used filter least significant byte in samples arrays. + * + * Is used filter out data in lsb byte when SampleSizeInBits is not + * dividable by 8. + * + **************************************************************************/ + + private static class AudioFloatLSBFilter extends AudioFloatConverter { + + private AudioFloatConverter converter; + + final private int offset; + + final private int stepsize; + + final private byte mask; + + private byte[] mask_buffer; + + public AudioFloatLSBFilter(AudioFloatConverter converter, + AudioFormat format) { + int bits = format.getSampleSizeInBits(); + boolean bigEndian = format.isBigEndian(); + this.converter = converter; + stepsize = (bits + 7) / 8; + offset = bigEndian ? (stepsize - 1) : 0; + int lsb_bits = bits % 8; + if (lsb_bits == 0) + mask = (byte) 0x00; + else if (lsb_bits == 1) + mask = (byte) 0x80; + else if (lsb_bits == 2) + mask = (byte) 0xC0; + else if (lsb_bits == 3) + mask = (byte) 0xE0; + else if (lsb_bits == 4) + mask = (byte) 0xF0; + else if (lsb_bits == 5) + mask = (byte) 0xF8; + else if (lsb_bits == 6) + mask = (byte) 0xFC; + else if (lsb_bits == 7) + mask = (byte) 0xFE; + else + mask = (byte) 0xFF; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + byte[] ret = converter.toByteArray(in_buff, in_offset, in_len, + out_buff, out_offset); + + int out_offset_end = in_len * stepsize; + for (int i = out_offset + offset; i < out_offset_end; i += stepsize) { + out_buff[i] = (byte) (out_buff[i] & mask); + } + + return ret; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + if (mask_buffer == null || mask_buffer.length < in_buff.length) + mask_buffer = new byte[in_buff.length]; + System.arraycopy(in_buff, 0, mask_buffer, 0, in_buff.length); + int in_offset_end = out_len * stepsize; + for (int i = in_offset + offset; i < in_offset_end; i += stepsize) { + mask_buffer[i] = (byte) (mask_buffer[i] & mask); + } + float[] ret = converter.toFloatArray(mask_buffer, in_offset, + out_buff, out_offset, out_len); + return ret; + } + + } + + /*************************************************************************** + * + * 64 bit float, little/big-endian + * + **************************************************************************/ + + // PCM 64 bit float, little-endian + private static class AudioFloatConversion64L extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + DoubleBuffer floatbuffer = null; + + double[] double_buff = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + if (double_buff == null + || double_buff.length < out_len + out_offset) + double_buff = new double[out_len + out_offset]; + floatbuffer.get(double_buff, out_offset, out_len); + int out_offset_end = out_offset + out_len; + for (int i = out_offset; i < out_offset_end; i++) { + out_buff[i] = (float) double_buff[i]; + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + if (double_buff == null || double_buff.length < in_offset + in_len) + double_buff = new double[in_offset + in_len]; + int in_offset_end = in_offset + in_len; + for (int i = in_offset; i < in_offset_end; i++) { + double_buff[i] = in_buff[i]; + } + floatbuffer.put(double_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + // PCM 64 bit float, big-endian + private static class AudioFloatConversion64B extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + DoubleBuffer floatbuffer = null; + + double[] double_buff = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + if (double_buff == null + || double_buff.length < out_len + out_offset) + double_buff = new double[out_len + out_offset]; + floatbuffer.get(double_buff, out_offset, out_len); + int out_offset_end = out_offset + out_len; + for (int i = out_offset; i < out_offset_end; i++) { + out_buff[i] = (float) double_buff[i]; + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + if (double_buff == null || double_buff.length < in_offset + in_len) + double_buff = new double[in_offset + in_len]; + int in_offset_end = in_offset + in_len; + for (int i = in_offset; i < in_offset_end; i++) { + double_buff[i] = in_buff[i]; + } + floatbuffer.put(double_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + /*************************************************************************** + * + * 32 bit float, little/big-endian + * + **************************************************************************/ + + // PCM 32 bit float, little-endian + private static class AudioFloatConversion32L extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + FloatBuffer floatbuffer = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + floatbuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + floatbuffer.put(in_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + // PCM 32 bit float, big-endian + private static class AudioFloatConversion32B extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + FloatBuffer floatbuffer = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + floatbuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + floatbuffer.put(in_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + /*************************************************************************** + * + * 8 bit signed/unsigned + * + **************************************************************************/ + + // PCM 8 bit, signed + private static class AudioFloatConversion8S extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) + out_buff[ox++] = in_buff[ix++] * (1.0f / 127.0f); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) + out_buff[ox++] = (byte) (in_buff[ix++] * 127.0f); + return out_buff; + } + } + + // PCM 8 bit, unsigned + private static class AudioFloatConversion8U extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) + out_buff[ox++] = ((in_buff[ix++] & 0xFF) - 127) + * (1.0f / 127.0f); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) + out_buff[ox++] = (byte) (127 + in_buff[ix++] * 127.0f); + return out_buff; + } + } + + /*************************************************************************** + * + * 16 bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 16 bit, signed, little-endian + private static class AudioFloatConversion16SL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int len = out_offset + out_len; + for (int ox = out_offset; ox < len; ox++) { + out_buff[ox] = ((short) ((in_buff[ix++] & 0xFF) | + (in_buff[ix++] << 8))) * (1.0f / 32767.0f); + } + + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ox = out_offset; + int len = in_offset + in_len; + for (int ix = in_offset; ix < len; ix++) { + int x = (int) (in_buff[ix] * 32767.0); + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + } + return out_buff; + } + } + + // PCM 16 bit, signed, big-endian + private static class AudioFloatConversion16SB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + out_buff[ox++] = ((short) ((in_buff[ix++] << 8) | + (in_buff[ix++] & 0xFF))) * (1.0f / 32767.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * 32767.0); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + // PCM 16 bit, unsigned, little-endian + private static class AudioFloatConversion16UL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8); + out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = 32767 + (int) (in_buff[ix++] * 32767.0); + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + } + return out_buff; + } + } + + // PCM 16 bit, unsigned, big-endian + private static class AudioFloatConversion16UB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = 32767 + (int) (in_buff[ix++] * 32767.0); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + /*************************************************************************** + * + * 24 bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 24 bit, signed, little-endian + private static class AudioFloatConversion24SL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16); + if (x > 0x7FFFFF) + x -= 0x1000000; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + if (x < 0) + x += 0x1000000; + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + } + return out_buff; + } + } + + // PCM 24 bit, signed, big-endian + private static class AudioFloatConversion24SB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + if (x > 0x7FFFFF) + x -= 0x1000000; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + if (x < 0) + x += 0x1000000; + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + // PCM 24 bit, unsigned, little-endian + private static class AudioFloatConversion24UL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16); + x -= 0x7FFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + x += 0x7FFFFF; + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + } + return out_buff; + } + } + + // PCM 24 bit, unsigned, big-endian + private static class AudioFloatConversion24UB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + x -= 0x7FFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + x += 0x7FFFFF; + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + /*************************************************************************** + * + * 32 bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 32 bit, signed, little-endian + private static class AudioFloatConversion32SL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 24); + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32 bit, signed, big-endian + private static class AudioFloatConversion32SB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + // PCM 32 bit, unsigned, little-endian + private static class AudioFloatConversion32UL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 24); + x -= 0x7FFFFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + x += 0x7FFFFFFF; + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32 bit, unsigned, big-endian + private static class AudioFloatConversion32UB extends AudioFloatConverter { + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + x -= 0x7FFFFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + x += 0x7FFFFFFF; + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + /*************************************************************************** + * + * 32+ bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 32+ bit, signed, little-endian + private static class AudioFloatConversion32xSL extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xSL(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + ix += xbytes; + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 24); + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32+ bit, signed, big-endian + private static class AudioFloatConversion32xSB extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xSB(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) + | ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 8) + | (in_buff[ix++] & 0xFF); + ix += xbytes; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + } + return out_buff; + } + } + + // PCM 32+ bit, unsigned, little-endian + private static class AudioFloatConversion32xUL extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xUL(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + ix += xbytes; + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 24); + x -= 0x7FFFFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + x += 0x7FFFFFFF; + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32+ bit, unsigned, big-endian + private static class AudioFloatConversion32xUB extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xUB(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + ix += xbytes; + x -= 2147483647; + out_buff[ox++] = x * (1.0f / 2147483647.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * 2147483647.0); + x += 2147483647; + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + } + return out_buff; + } + } + + public static AudioFloatConverter getConverter(AudioFormat format) { + AudioFloatConverter conv = null; + if (format.getFrameSize() == 0) + return null; + if (format.getFrameSize() != + ((format.getSampleSizeInBits() + 7) / 8) * format.getChannels()) { + return null; + } + if (format.getEncoding().equals(Encoding.PCM_SIGNED)) { + if (format.isBigEndian()) { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8S(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16SB(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24SB(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32SB(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xSB(((format + .getSampleSizeInBits() + 7) / 8) - 4); + } + } else { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8S(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16SL(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24SL(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32SL(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xSL(((format + .getSampleSizeInBits() + 7) / 8) - 4); + } + } + } else if (format.getEncoding().equals(Encoding.PCM_UNSIGNED)) { + if (format.isBigEndian()) { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8U(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16UB(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24UB(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32UB(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xUB((( + format.getSampleSizeInBits() + 7) / 8) - 4); + } + } else { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8U(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16UL(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24UL(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32UL(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xUL((( + format.getSampleSizeInBits() + 7) / 8) - 4); + } + } + } else if (format.getEncoding().equals(PCM_FLOAT)) { + if (format.getSampleSizeInBits() == 32) { + if (format.isBigEndian()) + conv = new AudioFloatConversion32B(); + else + conv = new AudioFloatConversion32L(); + } else if (format.getSampleSizeInBits() == 64) { + if (format.isBigEndian()) + conv = new AudioFloatConversion64B(); + else + conv = new AudioFloatConversion64L(); + } + + } + + if ((format.getEncoding().equals(Encoding.PCM_SIGNED) || + format.getEncoding().equals(Encoding.PCM_UNSIGNED)) && + (format.getSampleSizeInBits() % 8 != 0)) { + conv = new AudioFloatLSBFilter(conv, format); + } + + if (conv != null) + conv.format = format; + return conv; + } + + private AudioFormat format; + + public AudioFormat getFormat() { + return format; + } + + public abstract float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len); + + public float[] toFloatArray(byte[] in_buff, float[] out_buff, + int out_offset, int out_len) { + return toFloatArray(in_buff, 0, out_buff, out_offset, out_len); + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_len) { + return toFloatArray(in_buff, in_offset, out_buff, 0, out_len); + } + + public float[] toFloatArray(byte[] in_buff, float[] out_buff, int out_len) { + return toFloatArray(in_buff, 0, out_buff, 0, out_len); + } + + public float[] toFloatArray(byte[] in_buff, float[] out_buff) { + return toFloatArray(in_buff, 0, out_buff, 0, out_buff.length); + } + + public abstract byte[] toByteArray(float[] in_buff, int in_offset, + int in_len, byte[] out_buff, int out_offset); + + public byte[] toByteArray(float[] in_buff, int in_len, byte[] out_buff, + int out_offset) { + return toByteArray(in_buff, 0, in_len, out_buff, out_offset); + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff) { + return toByteArray(in_buff, in_offset, in_len, out_buff, 0); + } + + public byte[] toByteArray(float[] in_buff, int in_len, byte[] out_buff) { + return toByteArray(in_buff, 0, in_len, out_buff, 0); + } + + public byte[] toByteArray(float[] in_buff, byte[] out_buff) { + return toByteArray(in_buff, 0, in_buff.length, out_buff, 0); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,617 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.spi.FormatConversionProvider; + +/** + * This class is used to convert between 8,16,24,32 bit signed/unsigned + * big/litle endian fixed/floating stereo/mono/multi-channel audio streams and + * perform sample-rate conversion if needed. + * + * @author Karl Helgason + */ +public class AudioFloatFormatConverter extends FormatConversionProvider { + + private static class AudioFloatFormatConverterInputStream extends + InputStream { + private AudioFloatConverter converter; + + private AudioFloatInputStream stream; + + private float[] readfloatbuffer; + + private int fsize = 0; + + public AudioFloatFormatConverterInputStream(AudioFormat targetFormat, + AudioFloatInputStream stream) { + this.stream = stream; + converter = AudioFloatConverter.getConverter(targetFormat); + fsize = ((targetFormat.getSampleSizeInBits() + 7) / 8); + } + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b); + if (ret < 0) + return ret; + return b[0] & 0xFF; + } + + public int read(byte[] b, int off, int len) throws IOException { + + int flen = len / fsize; + if (readfloatbuffer == null || readfloatbuffer.length < flen) + readfloatbuffer = new float[flen]; + int ret = stream.read(readfloatbuffer, 0, flen); + if (ret < 0) + return ret; + converter.toByteArray(readfloatbuffer, 0, ret, b, off); + return ret * fsize; + } + + public int available() throws IOException { + int ret = stream.available(); + if (ret < 0) + return ret; + return ret * fsize; + } + + public void close() throws IOException { + stream.close(); + } + + public synchronized void mark(int readlimit) { + stream.mark(readlimit * fsize); + } + + public boolean markSupported() { + return stream.markSupported(); + } + + public synchronized void reset() throws IOException { + stream.reset(); + } + + public long skip(long n) throws IOException { + long ret = stream.skip(n / fsize); + if (ret < 0) + return ret; + return ret * fsize; + } + + } + + private static class AudioFloatInputStreamChannelMixer extends + AudioFloatInputStream { + + private int targetChannels; + + private int sourceChannels; + + private AudioFloatInputStream ais; + + private AudioFormat targetFormat; + + private float[] conversion_buffer; + + public AudioFloatInputStreamChannelMixer(AudioFloatInputStream ais, + int targetChannels) { + this.sourceChannels = ais.getFormat().getChannels(); + this.targetChannels = targetChannels; + this.ais = ais; + AudioFormat format = ais.getFormat(); + targetFormat = new AudioFormat(format.getEncoding(), format + .getSampleRate(), format.getSampleSizeInBits(), + targetChannels, (format.getFrameSize() / sourceChannels) + * targetChannels, format.getFrameRate(), format + .isBigEndian()); + } + + public int available() throws IOException { + return (ais.available() / sourceChannels) * targetChannels; + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return targetFormat; + } + + public long getFrameLength() { + return ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark((readlimit / targetChannels) * sourceChannels); + } + + public boolean markSupported() { + return ais.markSupported(); + } + + public int read(float[] b, int off, int len) throws IOException { + int len2 = (len / targetChannels) * sourceChannels; + if (conversion_buffer == null || conversion_buffer.length < len2) + conversion_buffer = new float[len2]; + int ret = ais.read(conversion_buffer, 0, len2); + if (ret < 0) + return ret; + if (sourceChannels == 1) { + int cs = targetChannels; + for (int c = 0; c < targetChannels; c++) { + for (int i = 0, ix = off + c; i < len2; i++, ix += cs) { + b[ix] = conversion_buffer[i]; + ; + } + } + } else if (targetChannels == 1) { + int cs = sourceChannels; + for (int i = 0, ix = off; i < len2; i += cs, ix++) { + b[ix] = conversion_buffer[i]; + } + for (int c = 1; c < sourceChannels; c++) { + for (int i = c, ix = off; i < len2; i += cs, ix++) { + b[ix] += conversion_buffer[i]; + ; + } + } + float vol = 1f / ((float) sourceChannels); + for (int i = 0, ix = off; i < len2; i += cs, ix++) { + b[ix] *= vol; + } + } else { + int minChannels = Math.min(sourceChannels, targetChannels); + int off_len = off + len; + int ct = targetChannels; + int cs = sourceChannels; + for (int c = 0; c < minChannels; c++) { + for (int i = off + c, ix = c; i < off_len; i += ct, ix += cs) { + b[i] = conversion_buffer[ix]; + } + } + for (int c = minChannels; c < targetChannels; c++) { + for (int i = off + c; i < off_len; i += ct) { + b[i] = 0; + } + } + } + return (ret / sourceChannels) * targetChannels; + } + + public void reset() throws IOException { + ais.reset(); + } + + public long skip(long len) throws IOException { + long ret = ais.skip((len / targetChannels) * sourceChannels); + if (ret < 0) + return ret; + return (ret / sourceChannels) * targetChannels; + } + + } + + private static class AudioFloatInputStreamResampler extends + AudioFloatInputStream { + + private AudioFloatInputStream ais; + + private AudioFormat targetFormat; + + private float[] skipbuffer; + + private SoftAbstractResampler resampler; + + private float[] pitch = new float[1]; + + private float[] ibuffer2; + + private float[][] ibuffer; + + private float ibuffer_index = 0; + + private int ibuffer_len = 0; + + private int nrofchannels = 0; + + private float[][] cbuffer; + + private int buffer_len = 512; + + private int pad; + + private int pad2; + + private float[] ix = new float[1]; + + private int[] ox = new int[1]; + + private float[][] mark_ibuffer = null; + + private float mark_ibuffer_index = 0; + + private int mark_ibuffer_len = 0; + + public AudioFloatInputStreamResampler(AudioFloatInputStream ais, + AudioFormat format) { + this.ais = ais; + AudioFormat sourceFormat = ais.getFormat(); + targetFormat = new AudioFormat(sourceFormat.getEncoding(), format + .getSampleRate(), sourceFormat.getSampleSizeInBits(), + sourceFormat.getChannels(), sourceFormat.getFrameSize(), + format.getSampleRate(), sourceFormat.isBigEndian()); + nrofchannels = targetFormat.getChannels(); + Object interpolation = format.getProperty("interpolation"); + if (interpolation != null && (interpolation instanceof String)) { + String resamplerType = (String) interpolation; + if (resamplerType.equalsIgnoreCase("point")) + this.resampler = new SoftPointResampler(); + if (resamplerType.equalsIgnoreCase("linear")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("linear1")) + this.resampler = new SoftLinearResampler(); + if (resamplerType.equalsIgnoreCase("linear2")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("cubic")) + this.resampler = new SoftCubicResampler(); + if (resamplerType.equalsIgnoreCase("lanczos")) + this.resampler = new SoftLanczosResampler(); + if (resamplerType.equalsIgnoreCase("sinc")) + this.resampler = new SoftSincResampler(); + } + if (resampler == null) + resampler = new SoftLinearResampler2(); // new + // SoftLinearResampler2(); + pitch[0] = sourceFormat.getSampleRate() / format.getSampleRate(); + pad = resampler.getPadding(); + pad2 = pad * 2; + ibuffer = new float[nrofchannels][buffer_len + pad2]; + ibuffer2 = new float[nrofchannels * buffer_len]; + ibuffer_index = buffer_len + pad; + ibuffer_len = buffer_len; + } + + public int available() throws IOException { + return 0; + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return targetFormat; + } + + public long getFrameLength() { + return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark((int) (readlimit * pitch[0])); + mark_ibuffer_index = ibuffer_index; + mark_ibuffer_len = ibuffer_len; + if (mark_ibuffer == null) { + mark_ibuffer = new float[ibuffer.length][ibuffer[0].length]; + } + for (int c = 0; c < ibuffer.length; c++) { + float[] from = ibuffer[c]; + float[] to = mark_ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + } + + public boolean markSupported() { + return ais.markSupported(); + } + + private void readNextBuffer() throws IOException { + + if (ibuffer_len == -1) + return; + + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + int buffer_len_pad = ibuffer_len + pad2; + for (int i = ibuffer_len, ix = 0; i < buffer_len_pad; i++, ix++) { + buff[ix] = buff[i]; + } + } + + ibuffer_index -= (ibuffer_len); + + ibuffer_len = ais.read(ibuffer2); + if (ibuffer_len >= 0) { + while (ibuffer_len < ibuffer2.length) { + int ret = ais.read(ibuffer2, ibuffer_len, ibuffer2.length + - ibuffer_len); + if (ret == -1) + break; + ibuffer_len += ret; + } + Arrays.fill(ibuffer2, ibuffer_len, ibuffer2.length, 0); + ibuffer_len /= nrofchannels; + } else { + Arrays.fill(ibuffer2, 0, ibuffer2.length, 0); + } + + int ibuffer2_len = ibuffer2.length; + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + for (int i = c, ix = pad2; i < ibuffer2_len; i += nrofchannels, ix++) { + buff[ix] = ibuffer2[i]; + } + } + + } + + public int read(float[] b, int off, int len) throws IOException { + + if (cbuffer == null || cbuffer[0].length < len / nrofchannels) { + cbuffer = new float[nrofchannels][len / nrofchannels]; + } + if (ibuffer_len == -1) + return -1; + if (len < 0) + return 0; + int remain = len / nrofchannels; + int destPos = 0; + int in_end = ibuffer_len; + while (remain > 0) { + if (ibuffer_len >= 0) { + if (ibuffer_index >= (ibuffer_len + pad)) + readNextBuffer(); + in_end = ibuffer_len + pad; + } + + if (ibuffer_len < 0) { + in_end = pad2; + if (ibuffer_index >= in_end) + break; + } + + if (ibuffer_index < 0) + break; + int preDestPos = destPos; + for (int c = 0; c < nrofchannels; c++) { + ix[0] = ibuffer_index; + ox[0] = destPos; + float[] buff = ibuffer[c]; + resampler.interpolate(buff, ix, in_end, pitch, 0, + cbuffer[c], ox, len / nrofchannels); + } + ibuffer_index = ix[0]; + destPos = ox[0]; + remain -= destPos - preDestPos; + } + for (int c = 0; c < nrofchannels; c++) { + int ix = 0; + float[] buff = cbuffer[c]; + for (int i = c; i < b.length; i += nrofchannels) { + b[i] = buff[ix++]; + } + } + return len - remain * nrofchannels; + } + + public void reset() throws IOException { + ais.reset(); + if (mark_ibuffer == null) + return; + ibuffer_index = mark_ibuffer_index; + ibuffer_len = mark_ibuffer_len; + for (int c = 0; c < ibuffer.length; c++) { + float[] from = mark_ibuffer[c]; + float[] to = ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + + } + + public long skip(long len) throws IOException { + if (len > 0) + return 0; + if (skipbuffer == null) + skipbuffer = new float[1024 * targetFormat.getFrameSize()]; + float[] l_skipbuffer = skipbuffer; + long remain = len; + while (remain > 0) { + int ret = read(l_skipbuffer, 0, (int) Math.min(remain, + skipbuffer.length)); + if (ret < 0) { + if (remain == len) + return ret; + break; + } + remain -= ret; + } + return len - remain; + + } + + } + + private Encoding[] formats = { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + + public AudioInputStream getAudioInputStream(Encoding targetEncoding, + AudioInputStream sourceStream) { + if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) + return sourceStream; + AudioFormat format = sourceStream.getFormat(); + int channels = format.getChannels(); + Encoding encoding = targetEncoding; + float samplerate = format.getSampleRate(); + int bits = format.getSampleSizeInBits(); + boolean bigendian = format.isBigEndian(); + if (targetEncoding.equals(AudioFloatConverter.PCM_FLOAT)) + bits = 32; + AudioFormat targetFormat = new AudioFormat(encoding, samplerate, bits, + channels, channels * bits / 8, samplerate, bigendian); + return getAudioInputStream(targetFormat, sourceStream); + } + + public AudioInputStream getAudioInputStream(AudioFormat targetFormat, + AudioInputStream sourceStream) { + if (!isConversionSupported(targetFormat, sourceStream.getFormat())) + throw new IllegalArgumentException("Unsupported conversion: " + + sourceStream.getFormat().toString() + " to " + + targetFormat.toString()); + return getAudioInputStream(targetFormat, AudioFloatInputStream + .getInputStream(sourceStream)); + } + + public AudioInputStream getAudioInputStream(AudioFormat targetFormat, + AudioFloatInputStream sourceStream) { + + if (!isConversionSupported(targetFormat, sourceStream.getFormat())) + throw new IllegalArgumentException("Unsupported conversion: " + + sourceStream.getFormat().toString() + " to " + + targetFormat.toString()); + if (targetFormat.getChannels() != sourceStream.getFormat() + .getChannels()) + sourceStream = new AudioFloatInputStreamChannelMixer(sourceStream, + targetFormat.getChannels()); + if (Math.abs(targetFormat.getSampleRate() + - sourceStream.getFormat().getSampleRate()) > 0.000001) + sourceStream = new AudioFloatInputStreamResampler(sourceStream, + targetFormat); + return new AudioInputStream(new AudioFloatFormatConverterInputStream( + targetFormat, sourceStream), targetFormat, sourceStream + .getFrameLength()); + } + + public Encoding[] getSourceEncodings() { + return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + } + + public Encoding[] getTargetEncodings() { + return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + } + + public Encoding[] getTargetEncodings(AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return new Encoding[0]; + return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + } + + public AudioFormat[] getTargetFormats(Encoding targetEncoding, + AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return new AudioFormat[0]; + int channels = sourceFormat.getChannels(); + + ArrayList formats = new ArrayList(); + + if (targetEncoding.equals(Encoding.PCM_SIGNED)) + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + if (targetEncoding.equals(Encoding.PCM_UNSIGNED)) + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + + for (int bits = 16; bits < 32; bits += 8) { + if (targetEncoding.equals(Encoding.PCM_SIGNED)) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + if (targetEncoding.equals(Encoding.PCM_UNSIGNED)) { + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + } + } + + if (targetEncoding.equals(AudioFloatConverter.PCM_FLOAT)) { + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + + return formats.toArray(new AudioFormat[formats.size()]); + } + + public boolean isConversionSupported(AudioFormat targetFormat, + AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return false; + if (AudioFloatConverter.getConverter(targetFormat) == null) + return false; + if (sourceFormat.getChannels() <= 0) + return false; + if (targetFormat.getChannels() <= 0) + return false; + return true; + } + + public boolean isConversionSupported(Encoding targetEncoding, + AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return false; + for (int i = 0; i < formats.length; i++) { + if (targetEncoding.equals(formats[i])) + return true; + } + return false; + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/AudioFloatInputStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFloatInputStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,281 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; + +/** + * This class is used to create AudioFloatInputStream from AudioInputStream and + * byte buffers. + * + * @author Karl Helgason + */ +public abstract class AudioFloatInputStream { + + private static class BytaArrayAudioFloatInputStream + extends AudioFloatInputStream { + + private int pos = 0; + private int markpos = 0; + private AudioFloatConverter converter; + private AudioFormat format; + private byte[] buffer; + private int buffer_offset; + private int buffer_len; + private int framesize_pc; + + public BytaArrayAudioFloatInputStream(AudioFloatConverter converter, + byte[] buffer, int offset, int len) { + this.converter = converter; + this.format = converter.getFormat(); + this.buffer = buffer; + this.buffer_offset = offset; + framesize_pc = format.getFrameSize() / format.getChannels(); + this.buffer_len = len / framesize_pc; + + } + + public AudioFormat getFormat() { + return format; + } + + public long getFrameLength() { + return buffer_len;// / format.getFrameSize(); + } + + public int read(float[] b, int off, int len) throws IOException { + if (b == null) + throw new NullPointerException(); + if (off < 0 || len < 0 || len > b.length - off) + throw new IndexOutOfBoundsException(); + if (pos >= buffer_len) + return -1; + if (len == 0) + return 0; + if (pos + len > buffer_len) + len = buffer_len - pos; + converter.toFloatArray(buffer, buffer_offset + pos * framesize_pc, + b, off, len); + pos += len; + return len; + } + + public long skip(long len) throws IOException { + if (pos >= buffer_len) + return -1; + if (len <= 0) + return 0; + if (pos + len > buffer_len) + len = buffer_len - pos; + pos += len; + return len; + } + + public int available() throws IOException { + return buffer_len - pos; + } + + public void close() throws IOException { + } + + public void mark(int readlimit) { + markpos = pos; + } + + public boolean markSupported() { + return true; + } + + public void reset() throws IOException { + pos = markpos; + } + } + + private static class DirectAudioFloatInputStream + extends AudioFloatInputStream { + + private AudioInputStream stream; + private AudioFloatConverter converter; + private int framesize_pc; // framesize / channels + private byte[] buffer; + + public DirectAudioFloatInputStream(AudioInputStream stream) { + converter = AudioFloatConverter.getConverter(stream.getFormat()); + if (converter == null) { + AudioFormat format = stream.getFormat(); + AudioFormat newformat; + + AudioFormat[] formats = AudioSystem.getTargetFormats( + AudioFormat.Encoding.PCM_SIGNED, format); + if (formats.length != 0) { + newformat = formats[0]; + } else { + float samplerate = format.getSampleRate(); + int samplesizeinbits = format.getSampleSizeInBits(); + int framesize = format.getFrameSize(); + float framerate = format.getFrameRate(); + samplesizeinbits = 16; + framesize = format.getChannels() * (samplesizeinbits / 8); + framerate = samplerate; + + newformat = new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, samplerate, + samplesizeinbits, format.getChannels(), framesize, + framerate, false); + } + + stream = AudioSystem.getAudioInputStream(newformat, stream); + converter = AudioFloatConverter.getConverter(stream.getFormat()); + } + framesize_pc = stream.getFormat().getFrameSize() + / stream.getFormat().getChannels(); + this.stream = stream; + } + + public AudioFormat getFormat() { + return stream.getFormat(); + } + + public long getFrameLength() { + return stream.getFrameLength(); + } + + public int read(float[] b, int off, int len) throws IOException { + int b_len = len * framesize_pc; + if (buffer == null || buffer.length < b_len) + buffer = new byte[b_len]; + int ret = stream.read(buffer, 0, b_len); + if (ret == -1) + return -1; + converter.toFloatArray(buffer, b, off, ret / framesize_pc); + return ret / framesize_pc; + } + + public long skip(long len) throws IOException { + long b_len = len * framesize_pc; + long ret = stream.skip(b_len); + if (ret == -1) + return -1; + return ret / framesize_pc; + } + + public int available() throws IOException { + return stream.available() / framesize_pc; + } + + public void close() throws IOException { + stream.close(); + } + + public void mark(int readlimit) { + stream.mark(readlimit * framesize_pc); + } + + public boolean markSupported() { + return stream.markSupported(); + } + + public void reset() throws IOException { + stream.reset(); + } + } + + public static AudioFloatInputStream getInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + return new DirectAudioFloatInputStream(AudioSystem + .getAudioInputStream(url)); + } + + public static AudioFloatInputStream getInputStream(File file) + throws UnsupportedAudioFileException, IOException { + return new DirectAudioFloatInputStream(AudioSystem + .getAudioInputStream(file)); + } + + public static AudioFloatInputStream getInputStream(InputStream stream) + throws UnsupportedAudioFileException, IOException { + return new DirectAudioFloatInputStream(AudioSystem + .getAudioInputStream(stream)); + } + + public static AudioFloatInputStream getInputStream( + AudioInputStream stream) { + return new DirectAudioFloatInputStream(stream); + } + + public static AudioFloatInputStream getInputStream(AudioFormat format, + byte[] buffer, int offset, int len) { + AudioFloatConverter converter = AudioFloatConverter + .getConverter(format); + if (converter != null) + return new BytaArrayAudioFloatInputStream(converter, buffer, + offset, len); + + InputStream stream = new ByteArrayInputStream(buffer, offset, len); + long aLen = format.getFrameSize() == AudioSystem.NOT_SPECIFIED + ? AudioSystem.NOT_SPECIFIED : len / format.getFrameSize(); + AudioInputStream astream = new AudioInputStream(stream, format, aLen); + return getInputStream(astream); + } + + public abstract AudioFormat getFormat(); + + public abstract long getFrameLength(); + + public abstract int read(float[] b, int off, int len) throws IOException; + + public int read(float[] b) throws IOException { + return read(b, 0, b.length); + } + + public float read() throws IOException { + float[] b = new float[1]; + int ret = read(b, 0, 1); + if (ret == -1 || ret == 0) + return 0; + return b[0]; + } + + public abstract long skip(long len) throws IOException; + + public abstract int available() throws IOException; + + public abstract void close() throws IOException; + + public abstract void mark(int readlimit); + + public abstract boolean markSupported(); + + public abstract void reset() throws IOException; +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/AudioSynthesizer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,128 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Map; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Synthesizer; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.SourceDataLine; + +/** + * AudioSynthesizer is a Synthesizer + * which renders it's output audio into SourceDataLine + * or AudioInputStream. + * + * @see MidiSystem#getSynthesizer + * @see Synthesizer + * + * @author Karl Helgason + */ +public interface AudioSynthesizer extends Synthesizer { + + /** + * Obtains the current format (encoding, sample rate, number of channels, + * etc.) of the synthesizer audio data. + * + *

If the synthesizer is not open and has never been opened, it returns + * the default format. + * + * @return current audio data format + * @see AudioFormat + */ + public AudioFormat getFormat(); + + /** + * Gets information about the possible properties for the synthesizer. + * + * @param info a proposed list of tag/value pairs that will be sent on open. + * @return an array of AudioSynthesizerPropertyInfo objects + * describing possible properties. This array may be an empty array if + * no properties are required. + */ + public AudioSynthesizerPropertyInfo[] getPropertyInfo( + Map info); + + /** + * Opens the synthesizer and starts rendering audio into + * SourceDataLine. + * + *

An application opening a synthesizer explicitly with this call + * has to close the synthesizer by calling {@link #close}. This is + * necessary to release system resources and allow applications to + * exit cleanly. + * + *

Note that some synthesizers, once closed, cannot be reopened. + * Attempts to reopen such a synthesizer will always result in + * a MidiUnavailableException. + * + * @param line which AudioSynthesizer writes output audio into. + * If line is null, then line from system default mixer is used. + * @param info a Map object containing + * properties for additional configuration supported by synthesizer. + * If info is null then default settings are used. + * + * @throws MidiUnavailableException thrown if the synthesizer cannot be + * opened due to resource restrictions. + * @throws SecurityException thrown if the synthesizer cannot be + * opened due to security restrictions. + * + * @see #close + * @see #isOpen + */ + public void open(SourceDataLine line, Map info) + throws MidiUnavailableException; + + /** + * Opens the synthesizer and renders audio into returned + * AudioInputStream. + * + *

An application opening a synthesizer explicitly with this call + * has to close the synthesizer by calling {@link #close}. This is + * necessary to release system resources and allow applications to + * exit cleanly. + * + *

Note that some synthesizers, once closed, cannot be reopened. + * Attempts to reopen such a synthesizer will always result in + * a MidiUnavailableException. + * + * @param targetFormat specifies the AudioFormat + * used in returned AudioInputStream. + * @param info a Map object containing + * properties for additional configuration supported by synthesizer. + * If info is null then default settings are used. + * + * @throws MidiUnavailableException thrown if the synthesizer cannot be + * opened due to resource restrictions. + * @throws SecurityException thrown if the synthesizer cannot be + * opened due to security restrictions. + * + * @see #close + * @see #isOpen + */ + public AudioInputStream openStream(AudioFormat targetFormat, + Map info) throws MidiUnavailableException; +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,76 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Information about property used in opening AudioSynthesizer. + * + * @author Karl Helgason + */ +public class AudioSynthesizerPropertyInfo { + + /** + * Constructs a AudioSynthesizerPropertyInfo object with a given + * name and value. The description and choices + * are intialized by null values. + * + * @param name the name of the property + * @param value the current value or class used for values. + * + */ + public AudioSynthesizerPropertyInfo(String name, Object value) { + this.name = name; + this.value = value; + if (value instanceof Class) + valueClass = (Class)value; + else if (value != null) + valueClass = value.getClass(); + } + /** + * The name of the property. + */ + public String name; + /** + * A brief description of the property, which may be null. + */ + public String description = null; + /** + * The value field specifies the current value of + * the property. + */ + public Object value = null; + /** + * The valueClass field specifies class + * used in value field. + */ + public Class valueClass = null; + /** + * An array of possible values if the value for the field + * AudioSynthesizerPropertyInfo.value may be selected + * from a particular set of values; otherwise null. + */ + public Object[] choices = null; + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSInfo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,109 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to store information to describe soundbanks, instruments + * and samples. It is stored inside a "INFO" List Chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSInfo { + + /** + * (INAM) Title or subject. + */ + public String name = "untitled"; + /** + * (ICRD) Date of creation, the format is: YYYY-MM-DD. + * For example 2007-01-01 for 1. january of year 2007. + */ + public String creationDate = null; + /** + * (IENG) Name of engineer who created the object. + */ + public String engineers = null; + /** + * (IPRD) Name of the product which the object is intended for. + */ + public String product = null; + /** + * (ICOP) Copyright information. + */ + public String copyright = null; + /** + * (ICMT) General comments. Doesn't contain newline characters. + */ + public String comments = null; + /** + * (ISFT) Name of software package used to create the file. + */ + public String tools = null; + /** + * (IARL) Where content is archived. + */ + public String archival_location = null; + /** + * (IART) Artists of original content. + */ + public String artist = null; + /** + * (ICMS) Names of persons or orginizations who commissioned the file. + */ + public String commissioned = null; + /** + * (IGNR) Genre of the work. + * Example: jazz, classical, rock, etc. + */ + public String genre = null; + /** + * (IKEY) List of keyword that describe the content. + * Examples: FX, bird, piano, etc. + */ + public String keywords = null; + /** + * (IMED) Describes original medium of the data. + * For example: record, CD, etc. + */ + public String medium = null; + /** + * (ISBJ) Description of the content. + */ + public String subject = null; + /** + * (ISRC) Name of person or orginization who supplied + * orginal material for the file. + */ + public String source = null; + /** + * (ISRF) Source media for sample data is from. + * For example: CD, TV, etc. + */ + public String source_form = null; + /** + * (ITCH) Technician who sample the file/object. + */ + public String technician = null; +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,448 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Patch; + +/** + * This class is used to store information to describe instrument. + * It contains list of regions and modulators. + * It is stored inside a "ins " List Chunk inside DLS files. + * In the DLS documentation a modulator is called articulator. + * + * @author Karl Helgason + */ +public class DLSInstrument extends ModelInstrument { + + protected int preset = 0; + protected int bank = 0; + protected boolean druminstrument = false; + protected byte[] guid = null; + protected DLSInfo info = new DLSInfo(); + protected List regions = new ArrayList(); + protected List modulators = new ArrayList(); + + public DLSInstrument() { + super(null, null, null, null); + } + + public DLSInstrument(DLSSoundbank soundbank) { + super(soundbank, null, null, null); + } + + public DLSInfo getInfo() { + return info; + } + + public String getName() { + return info.name; + } + + public void setName(String name) { + info.name = name; + } + + public ModelPatch getPatch() { + return new ModelPatch(bank, preset, druminstrument); + } + + public void setPatch(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch)patch).isPercussion()) { + druminstrument = true; + bank = patch.getBank(); + preset = patch.getProgram(); + } else { + druminstrument = false; + bank = patch.getBank(); + preset = patch.getProgram(); + } + } + + public Object getData() { + return null; + } + + public List getRegions() { + return regions; + } + + public List getModulators() { + return modulators; + } + + public String toString() { + if (druminstrument) + return "Drumkit: " + info.name + + " bank #" + bank + " preset #" + preset; + else + return "Instrument: " + info.name + + " bank #" + bank + " preset #" + preset; + } + + private ModelIdentifier convertToModelDest(int dest) { + if (dest == DLSModulator.CONN_DST_NONE) + return null; + if (dest == DLSModulator.CONN_DST_GAIN) + return ModelDestination.DESTINATION_GAIN; + if (dest == DLSModulator.CONN_DST_PITCH) + return ModelDestination.DESTINATION_PITCH; + if (dest == DLSModulator.CONN_DST_PAN) + return ModelDestination.DESTINATION_PAN; + + if (dest == DLSModulator.CONN_DST_LFO_FREQUENCY) + return ModelDestination.DESTINATION_LFO1_FREQ; + if (dest == DLSModulator.CONN_DST_LFO_STARTDELAY) + return ModelDestination.DESTINATION_LFO1_DELAY; + + if (dest == DLSModulator.CONN_DST_EG1_ATTACKTIME) + return ModelDestination.DESTINATION_EG1_ATTACK; + if (dest == DLSModulator.CONN_DST_EG1_DECAYTIME) + return ModelDestination.DESTINATION_EG1_DECAY; + if (dest == DLSModulator.CONN_DST_EG1_RELEASETIME) + return ModelDestination.DESTINATION_EG1_RELEASE; + if (dest == DLSModulator.CONN_DST_EG1_SUSTAINLEVEL) + return ModelDestination.DESTINATION_EG1_SUSTAIN; + + if (dest == DLSModulator.CONN_DST_EG2_ATTACKTIME) + return ModelDestination.DESTINATION_EG2_ATTACK; + if (dest == DLSModulator.CONN_DST_EG2_DECAYTIME) + return ModelDestination.DESTINATION_EG2_DECAY; + if (dest == DLSModulator.CONN_DST_EG2_RELEASETIME) + return ModelDestination.DESTINATION_EG2_RELEASE; + if (dest == DLSModulator.CONN_DST_EG2_SUSTAINLEVEL) + return ModelDestination.DESTINATION_EG2_SUSTAIN; + + // DLS2 Destinations + if (dest == DLSModulator.CONN_DST_KEYNUMBER) + return ModelDestination.DESTINATION_KEYNUMBER; + + if (dest == DLSModulator.CONN_DST_CHORUS) + return ModelDestination.DESTINATION_CHORUS; + if (dest == DLSModulator.CONN_DST_REVERB) + return ModelDestination.DESTINATION_REVERB; + + if (dest == DLSModulator.CONN_DST_VIB_FREQUENCY) + return ModelDestination.DESTINATION_LFO2_FREQ; + if (dest == DLSModulator.CONN_DST_VIB_STARTDELAY) + return ModelDestination.DESTINATION_LFO2_DELAY; + + if (dest == DLSModulator.CONN_DST_EG1_DELAYTIME) + return ModelDestination.DESTINATION_EG1_DELAY; + if (dest == DLSModulator.CONN_DST_EG1_HOLDTIME) + return ModelDestination.DESTINATION_EG1_HOLD; + if (dest == DLSModulator.CONN_DST_EG1_SHUTDOWNTIME) + return ModelDestination.DESTINATION_EG1_SHUTDOWN; + + if (dest == DLSModulator.CONN_DST_EG2_DELAYTIME) + return ModelDestination.DESTINATION_EG2_DELAY; + if (dest == DLSModulator.CONN_DST_EG2_HOLDTIME) + return ModelDestination.DESTINATION_EG2_HOLD; + + if (dest == DLSModulator.CONN_DST_FILTER_CUTOFF) + return ModelDestination.DESTINATION_FILTER_FREQ; + if (dest == DLSModulator.CONN_DST_FILTER_Q) + return ModelDestination.DESTINATION_FILTER_Q; + + return null; + } + + private ModelIdentifier convertToModelSrc(int src) { + if (src == DLSModulator.CONN_SRC_NONE) + return null; + + if (src == DLSModulator.CONN_SRC_LFO) + return ModelSource.SOURCE_LFO1; + if (src == DLSModulator.CONN_SRC_KEYONVELOCITY) + return ModelSource.SOURCE_NOTEON_VELOCITY; + if (src == DLSModulator.CONN_SRC_KEYNUMBER) + return ModelSource.SOURCE_NOTEON_KEYNUMBER; + if (src == DLSModulator.CONN_SRC_EG1) + return ModelSource.SOURCE_EG1; + if (src == DLSModulator.CONN_SRC_EG2) + return ModelSource.SOURCE_EG2; + if (src == DLSModulator.CONN_SRC_PITCHWHEEL) + return ModelSource.SOURCE_MIDI_PITCH; + if (src == DLSModulator.CONN_SRC_CC1) + return new ModelIdentifier("midi_cc", "1", 0); + if (src == DLSModulator.CONN_SRC_CC7) + return new ModelIdentifier("midi_cc", "7", 0); + if (src == DLSModulator.CONN_SRC_CC10) + return new ModelIdentifier("midi_cc", "10", 0); + if (src == DLSModulator.CONN_SRC_CC11) + return new ModelIdentifier("midi_cc", "11", 0); + if (src == DLSModulator.CONN_SRC_RPN0) + return new ModelIdentifier("midi_rpn", "0", 0); + if (src == DLSModulator.CONN_SRC_RPN1) + return new ModelIdentifier("midi_rpn", "1", 0); + + if (src == DLSModulator.CONN_SRC_POLYPRESSURE) + return ModelSource.SOURCE_MIDI_POLY_PRESSURE; + if (src == DLSModulator.CONN_SRC_CHANNELPRESSURE) + return ModelSource.SOURCE_MIDI_CHANNEL_PRESSURE; + if (src == DLSModulator.CONN_SRC_VIBRATO) + return ModelSource.SOURCE_LFO2; + if (src == DLSModulator.CONN_SRC_MONOPRESSURE) + return ModelSource.SOURCE_MIDI_CHANNEL_PRESSURE; + + if (src == DLSModulator.CONN_SRC_CC91) + return new ModelIdentifier("midi_cc", "91", 0); + if (src == DLSModulator.CONN_SRC_CC93) + return new ModelIdentifier("midi_cc", "93", 0); + + return null; + } + + private ModelConnectionBlock convertToModel(DLSModulator mod) { + ModelIdentifier source = convertToModelSrc(mod.getSource()); + ModelIdentifier control = convertToModelSrc(mod.getControl()); + ModelIdentifier destination_id = + convertToModelDest(mod.getDestination()); + + int scale = mod.getScale(); + double f_scale; + if (scale == Integer.MIN_VALUE) + f_scale = Double.NEGATIVE_INFINITY; + else + f_scale = scale / 65536.0; + + if (destination_id != null) { + ModelSource src = null; + ModelSource ctrl = null; + ModelConnectionBlock block = new ModelConnectionBlock(); + if (control != null) { + ModelSource s = new ModelSource(); + if (control == ModelSource.SOURCE_MIDI_PITCH) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } else if (control == ModelSource.SOURCE_LFO1 + || control == ModelSource.SOURCE_LFO2) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } + s.setIdentifier(control); + block.addSource(s); + ctrl = s; + } + if (source != null) { + ModelSource s = new ModelSource(); + if (source == ModelSource.SOURCE_MIDI_PITCH) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } else if (source == ModelSource.SOURCE_LFO1 + || source == ModelSource.SOURCE_LFO2) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } + s.setIdentifier(source); + block.addSource(s); + src = s; + } + ModelDestination destination = new ModelDestination(); + destination.setIdentifier(destination_id); + block.setDestination(destination); + + if (mod.getVersion() == 1) { + //if (mod.getTransform() == DLSModulator.CONN_TRN_CONCAVE) { + // ((ModelStandardTransform)destination.getTransform()) + // .setTransform( + // ModelStandardTransform.TRANSFORM_CONCAVE); + //} + if (mod.getTransform() == DLSModulator.CONN_TRN_CONCAVE) { + if (src != null) { + ((ModelStandardTransform)src.getTransform()) + .setTransform( + ModelStandardTransform.TRANSFORM_CONCAVE); + ((ModelStandardTransform)src.getTransform()) + .setDirection( + ModelStandardTransform.DIRECTION_MAX2MIN); + } + if (ctrl != null) { + ((ModelStandardTransform)ctrl.getTransform()) + .setTransform( + ModelStandardTransform.TRANSFORM_CONCAVE); + ((ModelStandardTransform)ctrl.getTransform()) + .setDirection( + ModelStandardTransform.DIRECTION_MAX2MIN); + } + } + + } else if (mod.getVersion() == 2) { + int transform = mod.getTransform(); + int src_transform_invert = (transform >> 15) & 1; + int src_transform_bipolar = (transform >> 14) & 1; + int src_transform = (transform >> 10) & 8; + int ctr_transform_invert = (transform >> 9) & 1; + int ctr_transform_bipolar = (transform >> 8) & 1; + int ctr_transform = (transform >> 4) & 8; + + + if (src != null) { + int trans = ModelStandardTransform.TRANSFORM_LINEAR; + if (src_transform == DLSModulator.CONN_TRN_SWITCH) + trans = ModelStandardTransform.TRANSFORM_SWITCH; + if (src_transform == DLSModulator.CONN_TRN_CONCAVE) + trans = ModelStandardTransform.TRANSFORM_CONCAVE; + if (src_transform == DLSModulator.CONN_TRN_CONVEX) + trans = ModelStandardTransform.TRANSFORM_CONVEX; + ((ModelStandardTransform)src.getTransform()) + .setTransform(trans); + ((ModelStandardTransform)src.getTransform()) + .setPolarity(src_transform_bipolar == 1); + ((ModelStandardTransform)src.getTransform()) + .setDirection(src_transform_invert == 1); + + } + + if (ctrl != null) { + int trans = ModelStandardTransform.TRANSFORM_LINEAR; + if (ctr_transform == DLSModulator.CONN_TRN_SWITCH) + trans = ModelStandardTransform.TRANSFORM_SWITCH; + if (ctr_transform == DLSModulator.CONN_TRN_CONCAVE) + trans = ModelStandardTransform.TRANSFORM_CONCAVE; + if (ctr_transform == DLSModulator.CONN_TRN_CONVEX) + trans = ModelStandardTransform.TRANSFORM_CONVEX; + ((ModelStandardTransform)ctrl.getTransform()) + .setTransform(trans); + ((ModelStandardTransform)ctrl.getTransform()) + .setPolarity(ctr_transform_bipolar == 1); + ((ModelStandardTransform)ctrl.getTransform()) + .setDirection(ctr_transform_invert == 1); + } + + /* No output transforms are defined the DLS Level 2 + int out_transform = transform % 8; + int trans = ModelStandardTransform.TRANSFORM_LINEAR; + if (out_transform == DLSModulator.CONN_TRN_SWITCH) + trans = ModelStandardTransform.TRANSFORM_SWITCH; + if (out_transform == DLSModulator.CONN_TRN_CONCAVE) + trans = ModelStandardTransform.TRANSFORM_CONCAVE; + if (out_transform == DLSModulator.CONN_TRN_CONVEX) + trans = ModelStandardTransform.TRANSFORM_CONVEX; + if (ctrl != null) { + ((ModelStandardTransform)destination.getTransform()) + .setTransform(trans); + } + */ + + } + + block.setScale(f_scale); + + return block; + } + + return null; + } + + public ModelPerformer[] getPerformers() { + List performers = new ArrayList(); + + Map modmap = new HashMap(); + for (DLSModulator mod: getModulators()) { + modmap.put(mod.getSource() + "x" + mod.getControl() + "=" + + mod.getDestination(), mod); + } + + Map insmodmap = + new HashMap(); + + for (DLSRegion zone: regions) { + ModelPerformer performer = new ModelPerformer(); + performer.setName(zone.getSample().getName()); + performer.setSelfNonExclusive((zone.getFusoptions() & + DLSRegion.OPTION_SELFNONEXCLUSIVE) != 0); + performer.setExclusiveClass(zone.getExclusiveClass()); + performer.setKeyFrom(zone.getKeyfrom()); + performer.setKeyTo(zone.getKeyto()); + performer.setVelFrom(zone.getVelfrom()); + performer.setVelTo(zone.getVelto()); + + insmodmap.clear(); + insmodmap.putAll(modmap); + for (DLSModulator mod: zone.getModulators()) { + insmodmap.put(mod.getSource() + "x" + mod.getControl() + "=" + + mod.getDestination(), mod); + } + + List blocks = performer.getConnectionBlocks(); + for (DLSModulator mod: insmodmap.values()) { + ModelConnectionBlock p = convertToModel(mod); + if (p != null) + blocks.add(p); + } + + + DLSSample sample = zone.getSample(); + DLSSampleOptions sampleopt = zone.getSampleoptions(); + if (sampleopt == null) + sampleopt = sample.getSampleoptions(); + + ModelByteBuffer buff = sample.getDataBuffer(); + + float pitchcorrection = (-sampleopt.unitynote * 100) + + sampleopt.finetune; + + ModelByteBufferWavetable osc = new ModelByteBufferWavetable(buff, + sample.getFormat(), pitchcorrection); + osc.setAttenuation(osc.getAttenuation() / 65536f); + if (sampleopt.getLoops().size() != 0) { + DLSSampleLoop loop = sampleopt.getLoops().get(0); + osc.setLoopStart((int)loop.getStart()); + osc.setLoopLength((int)loop.getLength()); + if (loop.getType() == DLSSampleLoop.LOOP_TYPE_FORWARD) + osc.setLoopType(ModelWavetable.LOOP_TYPE_FORWARD); + if (loop.getType() == DLSSampleLoop.LOOP_TYPE_RELEASE) + osc.setLoopType(ModelWavetable.LOOP_TYPE_RELEASE); + else + osc.setLoopType(ModelWavetable.LOOP_TYPE_FORWARD); + } + + performer.getConnectionBlocks().add( + new ModelConnectionBlock(SoftFilter.FILTERTYPE_LP12, + new ModelDestination( + new ModelIdentifier("filter", "type", 1)))); + + performer.getOscillators().add(osc); + + performers.add(performer); + + } + + return performers.toArray(new ModelPerformer[performers.size()]); + } + + public byte[] getGuid() { + return guid; + } + + public void setGuid(byte[] guid) { + this.guid = guid; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSModulator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSModulator.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,351 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to store modulator/artiuclation data. + * A modulator connects one synthesizer source to + * a destination. For example a note on velocity + * can be mapped to the gain of the synthesized voice. + * It is stored as a "art1" or "art2" chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSModulator { + + // DLS1 Destinations + public static final int CONN_DST_NONE = 0x000; // 0 + public static final int CONN_DST_GAIN = 0x001; // cB + public static final int CONN_DST_PITCH = 0x003; // cent + public static final int CONN_DST_PAN = 0x004; // 0.1% + public static final int CONN_DST_LFO_FREQUENCY = 0x104; // cent (default 5 Hz) + public static final int CONN_DST_LFO_STARTDELAY = 0x105; // timecent + public static final int CONN_DST_EG1_ATTACKTIME = 0x206; // timecent + public static final int CONN_DST_EG1_DECAYTIME = 0x207; // timecent + public static final int CONN_DST_EG1_RELEASETIME = 0x209; // timecent + public static final int CONN_DST_EG1_SUSTAINLEVEL = 0x20A; // 0.1% + public static final int CONN_DST_EG2_ATTACKTIME = 0x30A; // timecent + public static final int CONN_DST_EG2_DECAYTIME = 0x30B; // timecent + public static final int CONN_DST_EG2_RELEASETIME = 0x30D; // timecent + public static final int CONN_DST_EG2_SUSTAINLEVEL = 0x30E; // 0.1% + // DLS2 Destinations + public static final int CONN_DST_KEYNUMBER = 0x005; + public static final int CONN_DST_LEFT = 0x010; // 0.1% + public static final int CONN_DST_RIGHT = 0x011; // 0.1% + public static final int CONN_DST_CENTER = 0x012; // 0.1% + public static final int CONN_DST_LEFTREAR = 0x013; // 0.1% + public static final int CONN_DST_RIGHTREAR = 0x014; // 0.1% + public static final int CONN_DST_LFE_CHANNEL = 0x015; // 0.1% + public static final int CONN_DST_CHORUS = 0x080; // 0.1% + public static final int CONN_DST_REVERB = 0x081; // 0.1% + public static final int CONN_DST_VIB_FREQUENCY = 0x114; // cent + public static final int CONN_DST_VIB_STARTDELAY = 0x115; // dB + public static final int CONN_DST_EG1_DELAYTIME = 0x20B; // timecent + public static final int CONN_DST_EG1_HOLDTIME = 0x20C; // timecent + public static final int CONN_DST_EG1_SHUTDOWNTIME = 0x20D; // timecent + public static final int CONN_DST_EG2_DELAYTIME = 0x30F; // timecent + public static final int CONN_DST_EG2_HOLDTIME = 0x310; // timecent + public static final int CONN_DST_FILTER_CUTOFF = 0x500; // cent + public static final int CONN_DST_FILTER_Q = 0x501; // dB + + // DLS1 Sources + public static final int CONN_SRC_NONE = 0x000; // 1 + public static final int CONN_SRC_LFO = 0x001; // linear (sine wave) + public static final int CONN_SRC_KEYONVELOCITY = 0x002; // ??db or velocity?? + public static final int CONN_SRC_KEYNUMBER = 0x003; // ??cent or keynumber?? + public static final int CONN_SRC_EG1 = 0x004; // linear direct from eg + public static final int CONN_SRC_EG2 = 0x005; // linear direct from eg + public static final int CONN_SRC_PITCHWHEEL = 0x006; // linear -1..1 + public static final int CONN_SRC_CC1 = 0x081; // linear 0..1 + public static final int CONN_SRC_CC7 = 0x087; // linear 0..1 + public static final int CONN_SRC_CC10 = 0x08A; // linear 0..1 + public static final int CONN_SRC_CC11 = 0x08B; // linear 0..1 + public static final int CONN_SRC_RPN0 = 0x100; // ?? // Pitch Bend Range + public static final int CONN_SRC_RPN1 = 0x101; // ?? // Fine Tune + public static final int CONN_SRC_RPN2 = 0x102; // ?? // Course Tune + // DLS2 Sources + public static final int CONN_SRC_POLYPRESSURE = 0x007; // linear 0..1 + public static final int CONN_SRC_CHANNELPRESSURE = 0x008; // linear 0..1 + public static final int CONN_SRC_VIBRATO = 0x009; // linear 0..1 + public static final int CONN_SRC_MONOPRESSURE = 0x00A; // linear 0..1 + public static final int CONN_SRC_CC91 = 0x0DB; // linear 0..1 + public static final int CONN_SRC_CC93 = 0x0DD; // linear 0..1 + // DLS1 Transforms + public static final int CONN_TRN_NONE = 0x000; + public static final int CONN_TRN_CONCAVE = 0x001; + // DLS2 Transforms + public static final int CONN_TRN_CONVEX = 0x002; + public static final int CONN_TRN_SWITCH = 0x003; + public static final int DST_FORMAT_CB = 1; + public static final int DST_FORMAT_CENT = 1; + public static final int DST_FORMAT_TIMECENT = 2; + public static final int DST_FORMAT_PERCENT = 3; + protected int source; + protected int control; + protected int destination; + protected int transform; + protected int scale; + protected int version = 1; + + public int getControl() { + return control; + } + + public void setControl(int control) { + this.control = control; + } + + public static int getDestinationFormat(int destination) { + + if (destination == CONN_DST_GAIN) + return DST_FORMAT_CB; + if (destination == CONN_DST_PITCH) + return DST_FORMAT_CENT; + if (destination == CONN_DST_PAN) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_LFO_FREQUENCY) + return DST_FORMAT_CENT; + if (destination == CONN_DST_LFO_STARTDELAY) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_EG1_ATTACKTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_DECAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_RELEASETIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_SUSTAINLEVEL) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_EG2_ATTACKTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_DECAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_RELEASETIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_SUSTAINLEVEL) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_KEYNUMBER) + return DST_FORMAT_CENT; // NOT SURE WITHOUT DLS 2 SPEC + if (destination == CONN_DST_LEFT) + return DST_FORMAT_CB; + if (destination == CONN_DST_RIGHT) + return DST_FORMAT_CB; + if (destination == CONN_DST_CENTER) + return DST_FORMAT_CB; + if (destination == CONN_DST_LEFTREAR) + return DST_FORMAT_CB; + if (destination == CONN_DST_RIGHTREAR) + return DST_FORMAT_CB; + if (destination == CONN_DST_LFE_CHANNEL) + return DST_FORMAT_CB; + if (destination == CONN_DST_CHORUS) + return DST_FORMAT_PERCENT; + if (destination == CONN_DST_REVERB) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_VIB_FREQUENCY) + return DST_FORMAT_CENT; + if (destination == CONN_DST_VIB_STARTDELAY) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_EG1_DELAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_HOLDTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_SHUTDOWNTIME) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_EG2_DELAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_HOLDTIME) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_FILTER_CUTOFF) + return DST_FORMAT_CENT; + if (destination == CONN_DST_FILTER_Q) + return DST_FORMAT_CB; + + return -1; + } + + public static String getDestinationName(int destination) { + + if (destination == CONN_DST_GAIN) + return "gain"; + if (destination == CONN_DST_PITCH) + return "pitch"; + if (destination == CONN_DST_PAN) + return "pan"; + + if (destination == CONN_DST_LFO_FREQUENCY) + return "lfo1.freq"; + if (destination == CONN_DST_LFO_STARTDELAY) + return "lfo1.delay"; + + if (destination == CONN_DST_EG1_ATTACKTIME) + return "eg1.attack"; + if (destination == CONN_DST_EG1_DECAYTIME) + return "eg1.decay"; + if (destination == CONN_DST_EG1_RELEASETIME) + return "eg1.release"; + if (destination == CONN_DST_EG1_SUSTAINLEVEL) + return "eg1.sustain"; + + if (destination == CONN_DST_EG2_ATTACKTIME) + return "eg2.attack"; + if (destination == CONN_DST_EG2_DECAYTIME) + return "eg2.decay"; + if (destination == CONN_DST_EG2_RELEASETIME) + return "eg2.release"; + if (destination == CONN_DST_EG2_SUSTAINLEVEL) + return "eg2.sustain"; + + if (destination == CONN_DST_KEYNUMBER) + return "keynumber"; + if (destination == CONN_DST_LEFT) + return "left"; + if (destination == CONN_DST_RIGHT) + return "right"; + if (destination == CONN_DST_CENTER) + return "center"; + if (destination == CONN_DST_LEFTREAR) + return "leftrear"; + if (destination == CONN_DST_RIGHTREAR) + return "rightrear"; + if (destination == CONN_DST_LFE_CHANNEL) + return "lfe_channel"; + if (destination == CONN_DST_CHORUS) + return "chorus"; + if (destination == CONN_DST_REVERB) + return "reverb"; + + if (destination == CONN_DST_VIB_FREQUENCY) + return "vib.freq"; + if (destination == CONN_DST_VIB_STARTDELAY) + return "vib.delay"; + + if (destination == CONN_DST_EG1_DELAYTIME) + return "eg1.delay"; + if (destination == CONN_DST_EG1_HOLDTIME) + return "eg1.hold"; + if (destination == CONN_DST_EG1_SHUTDOWNTIME) + return "eg1.shutdown"; + + if (destination == CONN_DST_EG2_DELAYTIME) + return "eg2.delay"; + if (destination == CONN_DST_EG2_HOLDTIME) + return "eg.2hold"; + + if (destination == CONN_DST_FILTER_CUTOFF) + return "filter.cutoff"; // NOT SURE WITHOUT DLS 2 SPEC + if (destination == CONN_DST_FILTER_Q) + return "filter.q"; // NOT SURE WITHOUT DLS 2 SPEC + + return null; + } + + public static String getSourceName(int source) { + + if (source == CONN_SRC_NONE) + return "none"; + if (source == CONN_SRC_LFO) + return "lfo"; + if (source == CONN_SRC_KEYONVELOCITY) + return "keyonvelocity"; + if (source == CONN_SRC_KEYNUMBER) + return "keynumber"; + if (source == CONN_SRC_EG1) + return "eg1"; + if (source == CONN_SRC_EG2) + return "eg2"; + if (source == CONN_SRC_PITCHWHEEL) + return "pitchweel"; + if (source == CONN_SRC_CC1) + return "cc1"; + if (source == CONN_SRC_CC7) + return "cc7"; + if (source == CONN_SRC_CC10) + return "c10"; + if (source == CONN_SRC_CC11) + return "cc11"; + + if (source == CONN_SRC_POLYPRESSURE) + return "polypressure"; + if (source == CONN_SRC_CHANNELPRESSURE) + return "channelpressure"; + if (source == CONN_SRC_VIBRATO) + return "vibrato"; + if (source == CONN_SRC_MONOPRESSURE) + return "monopressure"; + if (source == CONN_SRC_CC91) + return "cc91"; + if (source == CONN_SRC_CC93) + return "cc93"; + return null; + } + + public int getDestination() { + return destination; + } + + public void setDestination(int destination) { + this.destination = destination; + } + + public int getScale() { + return scale; + } + + public void setScale(int scale) { + this.scale = scale; + } + + public int getSource() { + return source; + } + + public void setSource(int source) { + this.source = source; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public int getTransform() { + return transform; + } + + public void setTransform(int transform) { + this.transform = transform; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSRegion.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSRegion.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,150 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to store region parts for instrument. + * A region has a velocity and key range which it response to. + * And it has a list of modulators/articulators which + * is used how to synthesize a single voice. + * It is stored inside a "rgn " List Chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSRegion { + + public final static int OPTION_SELFNONEXCLUSIVE = 0x0001; + protected List modulators = new ArrayList(); + protected int keyfrom; + protected int keyto; + protected int velfrom; + protected int velto; + protected int options; + protected int exclusiveClass; + protected int fusoptions; + protected int phasegroup; + protected long channel; + protected DLSSample sample = null; + protected DLSSampleOptions sampleoptions; + + public List getModulators() { + return modulators; + } + + public long getChannel() { + return channel; + } + + public void setChannel(long channel) { + this.channel = channel; + } + + public int getExclusiveClass() { + return exclusiveClass; + } + + public void setExclusiveClass(int exclusiveClass) { + this.exclusiveClass = exclusiveClass; + } + + public int getFusoptions() { + return fusoptions; + } + + public void setFusoptions(int fusoptions) { + this.fusoptions = fusoptions; + } + + public int getKeyfrom() { + return keyfrom; + } + + public void setKeyfrom(int keyfrom) { + this.keyfrom = keyfrom; + } + + public int getKeyto() { + return keyto; + } + + public void setKeyto(int keyto) { + this.keyto = keyto; + } + + public int getOptions() { + return options; + } + + public void setOptions(int options) { + this.options = options; + } + + public int getPhasegroup() { + return phasegroup; + } + + public void setPhasegroup(int phasegroup) { + this.phasegroup = phasegroup; + } + + public DLSSample getSample() { + return sample; + } + + public void setSample(DLSSample sample) { + this.sample = sample; + } + + public int getVelfrom() { + return velfrom; + } + + public void setVelfrom(int velfrom) { + this.velfrom = velfrom; + } + + public int getVelto() { + return velto; + } + + public void setVelto(int velto) { + this.velto = velto; + } + + public void setModulators(List modulators) { + this.modulators = modulators; + } + + public DLSSampleOptions getSampleoptions() { + return sampleoptions; + } + + public void setSampleoptions(DLSSampleOptions sampleOptions) { + this.sampleoptions = sampleOptions; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSSample.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSample.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,122 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.InputStream; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +/** + * This class is used to store the sample data itself. + * A sample is encoded as PCM audio stream + * and in DLS Level 1 files it is always a mono 8/16 bit stream. + * They are stored just like RIFF WAVE files are stored. + * It is stored inside a "wave" List Chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSSample extends SoundbankResource { + + protected byte[] guid = null; + protected DLSInfo info = new DLSInfo(); + protected DLSSampleOptions sampleoptions; + protected ModelByteBuffer data; + protected AudioFormat format; + + public DLSSample(Soundbank soundBank) { + super(soundBank, null, AudioInputStream.class); + } + + public DLSSample() { + super(null, null, AudioInputStream.class); + } + + public DLSInfo getInfo() { + return info; + } + + public Object getData() { + AudioFormat format = getFormat(); + + InputStream is = data.getInputStream(); + if (is == null) + return null; + return new AudioInputStream(is, format, data.capacity()); + } + + public ModelByteBuffer getDataBuffer() { + return data; + } + + public AudioFormat getFormat() { + return format; + } + + public void setFormat(AudioFormat format) { + this.format = format; + } + + public void setData(ModelByteBuffer data) { + this.data = data; + } + + public void setData(byte[] data) { + this.data = new ModelByteBuffer(data); + } + + public void setData(byte[] data, int offset, int length) { + this.data = new ModelByteBuffer(data, offset, length); + } + + public String getName() { + return info.name; + } + + public void setName(String name) { + info.name = name; + } + + public DLSSampleOptions getSampleoptions() { + return sampleoptions; + } + + public void setSampleoptions(DLSSampleOptions sampleOptions) { + this.sampleoptions = sampleOptions; + } + + public String toString() { + return "Sample: " + info.name; + } + + public byte[] getGuid() { + return guid; + } + + public void setGuid(byte[] guid) { + this.guid = guid; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSSampleLoop.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSampleLoop.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to store loop points inside DLSSampleOptions class. + * + * @author Karl Helgason + */ +public class DLSSampleLoop { + + public final static int LOOP_TYPE_FORWARD = 0; + public final static int LOOP_TYPE_RELEASE = 1; + protected long type; + protected long start; + protected long length; + + public long getLength() { + return length; + } + + public void setLength(long length) { + this.length = length; + } + + public long getStart() { + return start; + } + + public void setStart(long start) { + this.start = start; + } + + public long getType() { + return type; + } + + public void setType(long type) { + this.type = type; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSSampleOptions.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSampleOptions.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,80 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class stores options how to playback sampled data like pitch/tuning, + * attenuation and loops. + * It is stored as a "wsmp" chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSSampleOptions { + + protected int unitynote; + protected short finetune; + protected int attenuation; + protected long options; + protected List loops = new ArrayList(); + + public int getAttenuation() { + return attenuation; + } + + public void setAttenuation(int attenuation) { + this.attenuation = attenuation; + } + + public short getFinetune() { + return finetune; + } + + public void setFinetune(short finetune) { + this.finetune = finetune; + } + + public List getLoops() { + return loops; + } + + public long getOptions() { + return options; + } + + public void setOptions(long options) { + this.options = options; + } + + public int getUnitynote() { + return unitynote; + } + + public void setUnitynote(int unitynote) { + this.unitynote = unitynote; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,1287 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFormat.Encoding; + +/** + * A DLS Level 1 and Level 2 soundbank reader (from files/url/streams). + * + * @author Karl Helgason + */ +public class DLSSoundbank implements Soundbank { + + static private class DLSID { + long i1; + int s1; + int s2; + int x1; + int x2; + int x3; + int x4; + int x5; + int x6; + int x7; + int x8; + + private DLSID() { + } + + public DLSID(long i1, int s1, int s2, int x1, int x2, int x3, int x4, + int x5, int x6, int x7, int x8) { + this.i1 = i1; + this.s1 = s1; + this.s2 = s2; + this.x1 = x1; + this.x2 = x2; + this.x3 = x3; + this.x4 = x4; + this.x5 = x5; + this.x6 = x6; + this.x7 = x7; + this.x8 = x8; + } + + public static DLSID read(RIFFReader riff) throws IOException { + DLSID d = new DLSID(); + d.i1 = riff.readUnsignedInt(); + d.s1 = riff.readUnsignedShort(); + d.s2 = riff.readUnsignedShort(); + d.x1 = riff.readUnsignedByte(); + d.x2 = riff.readUnsignedByte(); + d.x3 = riff.readUnsignedByte(); + d.x4 = riff.readUnsignedByte(); + d.x5 = riff.readUnsignedByte(); + d.x6 = riff.readUnsignedByte(); + d.x7 = riff.readUnsignedByte(); + d.x8 = riff.readUnsignedByte(); + return d; + } + + public int hashCode() { + return (int)i1; + } + + public boolean equals(Object obj) { + if (!(obj instanceof DLSID)) { + return false; + } + DLSID t = (DLSID) obj; + return i1 == t.i1 && s1 == t.s1 && s2 == t.s2 + && x1 == t.x1 && x2 == t.x2 && x3 == t.x3 && x4 == t.x4 + && x5 == t.x5 && x6 == t.x6 && x7 == t.x7 && x8 == t.x8; + } + } + + /** X = X & Y */ + private static final int DLS_CDL_AND = 0x0001; + /** X = X | Y */ + private static final int DLS_CDL_OR = 0x0002; + /** X = X ^ Y */ + private static final int DLS_CDL_XOR = 0x0003; + /** X = X + Y */ + private static final int DLS_CDL_ADD = 0x0004; + /** X = X - Y */ + private static final int DLS_CDL_SUBTRACT = 0x0005; + /** X = X * Y */ + private static final int DLS_CDL_MULTIPLY = 0x0006; + /** X = X / Y */ + private static final int DLS_CDL_DIVIDE = 0x0007; + /** X = X && Y */ + private static final int DLS_CDL_LOGICAL_AND = 0x0008; + /** X = X || Y */ + private static final int DLS_CDL_LOGICAL_OR = 0x0009; + /** X = (X < Y) */ + private static final int DLS_CDL_LT = 0x000A; + /** X = (X <= Y) */ + private static final int DLS_CDL_LE = 0x000B; + /** X = (X > Y) */ + private static final int DLS_CDL_GT = 0x000C; + /** X = (X >= Y) */ + private static final int DLS_CDL_GE = 0x000D; + /** X = (X == Y) */ + private static final int DLS_CDL_EQ = 0x000E; + /** X = !X */ + private static final int DLS_CDL_NOT = 0x000F; + /** 32-bit constant */ + private static final int DLS_CDL_CONST = 0x0010; + /** 32-bit value returned from query */ + private static final int DLS_CDL_QUERY = 0x0011; + /** 32-bit value returned from query */ + private static final int DLS_CDL_QUERYSUPPORTED = 0x0012; + + private static final DLSID DLSID_GMInHardware = new DLSID(0x178f2f24, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_GSInHardware = new DLSID(0x178f2f25, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_XGInHardware = new DLSID(0x178f2f26, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_SupportsDLS1 = new DLSID(0x178f2f27, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_SupportsDLS2 = new DLSID(0xf14599e5, + 0x4689, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); + private static final DLSID DLSID_SampleMemorySize = new DLSID(0x178f2f28, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_ManufacturersID = new DLSID(0xb03e1181, + 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); + private static final DLSID DLSID_ProductID = new DLSID(0xb03e1182, + 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); + private static final DLSID DLSID_SamplePlaybackRate = new DLSID(0x2a91f713, + 0xa4bf, 0x11d2, 0xbb, 0xdf, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); + + private long major = -1; + private long minor = -1; + + private DLSInfo info = new DLSInfo(); + + private List instruments = new ArrayList(); + private List samples = new ArrayList(); + + private boolean largeFormat = false; + private File sampleFile; + + public DLSSoundbank() { + } + + public DLSSoundbank(URL url) throws IOException { + InputStream is = url.openStream(); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public DLSSoundbank(File file) throws IOException { + largeFormat = true; + sampleFile = file; + InputStream is = new FileInputStream(file); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public DLSSoundbank(InputStream inputstream) throws IOException { + readSoundbank(inputstream); + } + + private void readSoundbank(InputStream inputstream) throws IOException { + RIFFReader riff = new RIFFReader(inputstream); + if (!riff.getFormat().equals("RIFF")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid RIFF stream!"); + } + if (!riff.getType().equals("DLS ")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid DLS soundbank!"); + } + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("INFO")) + readInfoChunk(chunk); + if (chunk.getType().equals("lins")) + readLinsChunk(chunk); + if (chunk.getType().equals("wvpl")) + readWvplChunk(chunk); + } else { + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + throw new RIFFInvalidFormatException( + "DLS file isn't supported!"); + } + } + if (chunk.getFormat().equals("colh")) { + // skipped because we will load the entire bank into memory + // long instrumentcount = chunk.readUnsignedInt(); + // System.out.println("instrumentcount = "+ instrumentcount); + } + if (chunk.getFormat().equals("ptbl")) { + // Pool Table Chunk + // skipped because we will load the entire bank into memory + } + if (chunk.getFormat().equals("vers")) { + major = chunk.readUnsignedInt(); + minor = chunk.readUnsignedInt(); + } + } + } + + for (Map.Entry entry : temp_rgnassign.entrySet()) { + entry.getKey().sample = samples.get((int)entry.getValue().longValue()); + } + + temp_rgnassign = null; + } + + private boolean cdlIsQuerySupported(DLSID uuid) { + return uuid.equals(DLSID_GMInHardware) + || uuid.equals(DLSID_GSInHardware) + || uuid.equals(DLSID_XGInHardware) + || uuid.equals(DLSID_SupportsDLS1) + || uuid.equals(DLSID_SupportsDLS2) + || uuid.equals(DLSID_SampleMemorySize) + || uuid.equals(DLSID_ManufacturersID) + || uuid.equals(DLSID_ProductID) + || uuid.equals(DLSID_SamplePlaybackRate); + } + + private long cdlQuery(DLSID uuid) { + if (uuid.equals(DLSID_GMInHardware)) + return 1; + if (uuid.equals(DLSID_GSInHardware)) + return 0; + if (uuid.equals(DLSID_XGInHardware)) + return 0; + if (uuid.equals(DLSID_SupportsDLS1)) + return 1; + if (uuid.equals(DLSID_SupportsDLS2)) + return 1; + if (uuid.equals(DLSID_SampleMemorySize)) + return Runtime.getRuntime().totalMemory(); + if (uuid.equals(DLSID_ManufacturersID)) + return 0; + if (uuid.equals(DLSID_ProductID)) + return 0; + if (uuid.equals(DLSID_SamplePlaybackRate)) + return 44100; + return 0; + } + + + // Reading cdl-ck Chunk + // "cdl " chunk can only appear inside : DLS,lart,lar2,rgn,rgn2 + private boolean readCdlChunk(RIFFReader riff) throws IOException { + + DLSID uuid; + long x; + long y; + Stack stack = new Stack(); + + while (riff.available() != 0) { + int opcode = riff.readUnsignedShort(); + switch (opcode) { + case DLS_CDL_AND: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) && (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_OR: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) || (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_XOR: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) ^ (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_ADD: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x + y)); + break; + case DLS_CDL_SUBTRACT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x - y)); + break; + case DLS_CDL_MULTIPLY: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x * y)); + break; + case DLS_CDL_DIVIDE: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x / y)); + break; + case DLS_CDL_LOGICAL_AND: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) && (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_LOGICAL_OR: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) || (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_LT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x < y) ? 1 : 0)); + break; + case DLS_CDL_LE: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x <= y) ? 1 : 0)); + break; + case DLS_CDL_GT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x > y) ? 1 : 0)); + break; + case DLS_CDL_GE: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x >= y) ? 1 : 0)); + break; + case DLS_CDL_EQ: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x == y) ? 1 : 0)); + break; + case DLS_CDL_NOT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x == 0) ? 1 : 0)); + break; + case DLS_CDL_CONST: + stack.push(Long.valueOf(riff.readUnsignedInt())); + break; + case DLS_CDL_QUERY: + uuid = DLSID.read(riff); + stack.push(cdlQuery(uuid)); + break; + case DLS_CDL_QUERYSUPPORTED: + uuid = DLSID.read(riff); + stack.push(Long.valueOf(cdlIsQuerySupported(uuid) ? 1 : 0)); + break; + default: + break; + } + } + if (stack.isEmpty()) + return false; + + return stack.pop() == 1; + } + + private void readInfoChunk(RIFFReader riff) throws IOException { + info.name = null; + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("INAM")) + info.name = chunk.readString(chunk.available()); + else if (format.equals("ICRD")) + info.creationDate = chunk.readString(chunk.available()); + else if (format.equals("IENG")) + info.engineers = chunk.readString(chunk.available()); + else if (format.equals("IPRD")) + info.product = chunk.readString(chunk.available()); + else if (format.equals("ICOP")) + info.copyright = chunk.readString(chunk.available()); + else if (format.equals("ICMT")) + info.comments = chunk.readString(chunk.available()); + else if (format.equals("ISFT")) + info.tools = chunk.readString(chunk.available()); + else if (format.equals("IARL")) + info.archival_location = chunk.readString(chunk.available()); + else if (format.equals("IART")) + info.artist = chunk.readString(chunk.available()); + else if (format.equals("ICMS")) + info.commissioned = chunk.readString(chunk.available()); + else if (format.equals("IGNR")) + info.genre = chunk.readString(chunk.available()); + else if (format.equals("IKEY")) + info.keywords = chunk.readString(chunk.available()); + else if (format.equals("IMED")) + info.medium = chunk.readString(chunk.available()); + else if (format.equals("ISBJ")) + info.subject = chunk.readString(chunk.available()); + else if (format.equals("ISRC")) + info.source = chunk.readString(chunk.available()); + else if (format.equals("ISRF")) + info.source_form = chunk.readString(chunk.available()); + else if (format.equals("ITCH")) + info.technician = chunk.readString(chunk.available()); + } + } + + private void readLinsChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("ins ")) + readInsChunk(chunk); + } + } + } + + private void readInsChunk(RIFFReader riff) throws IOException { + DLSInstrument instrument = new DLSInstrument(this); + + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("LIST")) { + if (chunk.getType().equals("INFO")) { + readInsInfoChunk(instrument, chunk); + } + if (chunk.getType().equals("lrgn")) { + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (subchunk.getFormat().equals("LIST")) { + if (subchunk.getType().equals("rgn ")) { + DLSRegion split = new DLSRegion(); + if (readRgnChunk(split, subchunk)) + instrument.getRegions().add(split); + } + if (subchunk.getType().equals("rgn2")) { + // support for DLS level 2 regions + DLSRegion split = new DLSRegion(); + if (readRgnChunk(split, subchunk)) + instrument.getRegions().add(split); + } + } + } + } + if (chunk.getType().equals("lart")) { + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art1")) + readArt1Chunk(modlist, subchunk); + } + instrument.getModulators().addAll(modlist); + } + if (chunk.getType().equals("lar2")) { + // support for DLS level 2 ART + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art2")) + readArt2Chunk(modlist, subchunk); + } + instrument.getModulators().addAll(modlist); + } + } else { + if (format.equals("dlid")) { + instrument.guid = new byte[16]; + chunk.readFully(instrument.guid); + } + if (format.equals("insh")) { + chunk.readUnsignedInt(); // Read Region Count - ignored + + int bank = chunk.read(); // LSB + bank += (chunk.read() & 127) << 7; // MSB + chunk.read(); // Read Reserved byte + int drumins = chunk.read(); // Drum Instrument + + int id = chunk.read() & 127; // Read only first 7 bits + chunk.read(); // Read Reserved byte + chunk.read(); // Read Reserved byte + chunk.read(); // Read Reserved byte + + instrument.bank = bank; + instrument.preset = (int) id; + instrument.druminstrument = (drumins & 128) > 0; + //System.out.println("bank="+bank+" drumkit="+drumkit + // +" id="+id); + } + + } + } + instruments.add(instrument); + } + + private void readArt1Chunk(List modulators, RIFFReader riff) + throws IOException { + long size = riff.readUnsignedInt(); + long count = riff.readUnsignedInt(); + + if (size - 8 != 0) + riff.skipBytes(size - 8); + + for (int i = 0; i < count; i++) { + DLSModulator modulator = new DLSModulator(); + modulator.version = 1; + modulator.source = riff.readUnsignedShort(); + modulator.control = riff.readUnsignedShort(); + modulator.destination = riff.readUnsignedShort(); + modulator.transform = riff.readUnsignedShort(); + modulator.scale = riff.readInt(); + modulators.add(modulator); + } + } + + private void readArt2Chunk(List modulators, RIFFReader riff) + throws IOException { + long size = riff.readUnsignedInt(); + long count = riff.readUnsignedInt(); + + if (size - 8 != 0) + riff.skipBytes(size - 8); + + for (int i = 0; i < count; i++) { + DLSModulator modulator = new DLSModulator(); + modulator.version = 2; + modulator.source = riff.readUnsignedShort(); + modulator.control = riff.readUnsignedShort(); + modulator.destination = riff.readUnsignedShort(); + modulator.transform = riff.readUnsignedShort(); + modulator.scale = riff.readInt(); + modulators.add(modulator); + } + } + + private Map temp_rgnassign = new HashMap(); + + private boolean readRgnChunk(DLSRegion split, RIFFReader riff) + throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("LIST")) { + if (chunk.getType().equals("lart")) { + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art1")) + readArt1Chunk(modlist, subchunk); + } + split.getModulators().addAll(modlist); + } + if (chunk.getType().equals("lar2")) { + // support for DLS level 2 ART + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art2")) + readArt2Chunk(modlist, subchunk); + } + split.getModulators().addAll(modlist); + } + } else { + + if (format.equals("cdl ")) { + if (!readCdlChunk(chunk)) + return false; + } + if (format.equals("rgnh")) { + split.keyfrom = chunk.readUnsignedShort(); + split.keyto = chunk.readUnsignedShort(); + split.velfrom = chunk.readUnsignedShort(); + split.velto = chunk.readUnsignedShort(); + split.options = chunk.readUnsignedShort(); + split.exclusiveClass = chunk.readUnsignedShort(); + } + if (format.equals("wlnk")) { + split.fusoptions = chunk.readUnsignedShort(); + split.phasegroup = chunk.readUnsignedShort(); + split.channel = chunk.readUnsignedInt(); + long sampleid = chunk.readUnsignedInt(); + temp_rgnassign.put(split, sampleid); + } + if (format.equals("wsmp")) { + split.sampleoptions = new DLSSampleOptions(); + readWsmpChunk(split.sampleoptions, chunk); + } + } + } + return true; + } + + private void readWsmpChunk(DLSSampleOptions sampleOptions, RIFFReader riff) + throws IOException { + long size = riff.readUnsignedInt(); + sampleOptions.unitynote = riff.readUnsignedShort(); + sampleOptions.finetune = riff.readShort(); + sampleOptions.attenuation = riff.readInt(); + sampleOptions.options = riff.readUnsignedInt(); + long loops = riff.readInt(); + + if (size > 20) + riff.skipBytes(size - 20); + + for (int i = 0; i < loops; i++) { + DLSSampleLoop loop = new DLSSampleLoop(); + long size2 = riff.readUnsignedInt(); + loop.type = riff.readUnsignedInt(); + loop.start = riff.readUnsignedInt(); + loop.length = riff.readUnsignedInt(); + sampleOptions.loops.add(loop); + if (size2 > 16) + riff.skipBytes(size2 - 16); + } + } + + private void readInsInfoChunk(DLSInstrument dlsinstrument, RIFFReader riff) + throws IOException { + dlsinstrument.info.name = null; + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("INAM")) { + dlsinstrument.info.name = chunk.readString(chunk.available()); + } else if (format.equals("ICRD")) { + dlsinstrument.info.creationDate = + chunk.readString(chunk.available()); + } else if (format.equals("IENG")) { + dlsinstrument.info.engineers = + chunk.readString(chunk.available()); + } else if (format.equals("IPRD")) { + dlsinstrument.info.product = chunk.readString(chunk.available()); + } else if (format.equals("ICOP")) { + dlsinstrument.info.copyright = + chunk.readString(chunk.available()); + } else if (format.equals("ICMT")) { + dlsinstrument.info.comments = + chunk.readString(chunk.available()); + } else if (format.equals("ISFT")) { + dlsinstrument.info.tools = chunk.readString(chunk.available()); + } else if (format.equals("IARL")) { + dlsinstrument.info.archival_location = + chunk.readString(chunk.available()); + } else if (format.equals("IART")) { + dlsinstrument.info.artist = chunk.readString(chunk.available()); + } else if (format.equals("ICMS")) { + dlsinstrument.info.commissioned = + chunk.readString(chunk.available()); + } else if (format.equals("IGNR")) { + dlsinstrument.info.genre = chunk.readString(chunk.available()); + } else if (format.equals("IKEY")) { + dlsinstrument.info.keywords = + chunk.readString(chunk.available()); + } else if (format.equals("IMED")) { + dlsinstrument.info.medium = chunk.readString(chunk.available()); + } else if (format.equals("ISBJ")) { + dlsinstrument.info.subject = chunk.readString(chunk.available()); + } else if (format.equals("ISRC")) { + dlsinstrument.info.source = chunk.readString(chunk.available()); + } else if (format.equals("ISRF")) { + dlsinstrument.info.source_form = + chunk.readString(chunk.available()); + } else if (format.equals("ITCH")) { + dlsinstrument.info.technician = + chunk.readString(chunk.available()); + } + } + } + + private void readWvplChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("wave")) + readWaveChunk(chunk); + } + } + } + + private void readWaveChunk(RIFFReader riff) throws IOException { + DLSSample sample = new DLSSample(this); + + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("LIST")) { + if (chunk.getType().equals("INFO")) { + readWaveInfoChunk(sample, chunk); + } + } else { + if (format.equals("dlid")) { + sample.guid = new byte[16]; + chunk.readFully(sample.guid); + } + + if (format.equals("fmt ")) { + int sampleformat = chunk.readUnsignedShort(); + if (sampleformat != 1 && sampleformat != 3) { + throw new RIFFInvalidDataException( + "Only PCM samples are supported!"); + } + int channels = chunk.readUnsignedShort(); + long samplerate = chunk.readUnsignedInt(); + // bytes per sec + /* long framerate = */ chunk.readUnsignedInt(); + // block align, framesize + int framesize = chunk.readUnsignedShort(); + int bits = chunk.readUnsignedShort(); + AudioFormat audioformat = null; + if (sampleformat == 1) { + if (bits == 8) { + audioformat = new AudioFormat( + Encoding.PCM_UNSIGNED, samplerate, bits, + channels, framesize, samplerate, false); + } else { + audioformat = new AudioFormat( + Encoding.PCM_SIGNED, samplerate, bits, + channels, framesize, samplerate, false); + } + } + if (sampleformat == 3) { + audioformat = new AudioFormat( + AudioFloatConverter.PCM_FLOAT, samplerate, bits, + channels, framesize, samplerate, false); + } + + sample.format = audioformat; + } + + if (format.equals("data")) { + if (largeFormat) { + sample.setData(new ModelByteBuffer(sampleFile, + chunk.getFilePointer(), chunk.available())); + } else { + byte[] buffer = new byte[chunk.available()]; + // chunk.read(buffer); + sample.setData(buffer); + + int read = 0; + int avail = chunk.available(); + while (read != avail) { + if (avail - read > 65536) { + chunk.readFully(buffer, read, 65536); + read += 65536; + } else { + chunk.readFully(buffer, read, avail - read); + read = avail; + } + } + } + } + + if (format.equals("wsmp")) { + sample.sampleoptions = new DLSSampleOptions(); + readWsmpChunk(sample.sampleoptions, chunk); + } + } + } + + samples.add(sample); + + } + + private void readWaveInfoChunk(DLSSample dlssample, RIFFReader riff) + throws IOException { + dlssample.info.name = null; + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("INAM")) { + dlssample.info.name = chunk.readString(chunk.available()); + } else if (format.equals("ICRD")) { + dlssample.info.creationDate = + chunk.readString(chunk.available()); + } else if (format.equals("IENG")) { + dlssample.info.engineers = chunk.readString(chunk.available()); + } else if (format.equals("IPRD")) { + dlssample.info.product = chunk.readString(chunk.available()); + } else if (format.equals("ICOP")) { + dlssample.info.copyright = chunk.readString(chunk.available()); + } else if (format.equals("ICMT")) { + dlssample.info.comments = chunk.readString(chunk.available()); + } else if (format.equals("ISFT")) { + dlssample.info.tools = chunk.readString(chunk.available()); + } else if (format.equals("IARL")) { + dlssample.info.archival_location = + chunk.readString(chunk.available()); + } else if (format.equals("IART")) { + dlssample.info.artist = chunk.readString(chunk.available()); + } else if (format.equals("ICMS")) { + dlssample.info.commissioned = + chunk.readString(chunk.available()); + } else if (format.equals("IGNR")) { + dlssample.info.genre = chunk.readString(chunk.available()); + } else if (format.equals("IKEY")) { + dlssample.info.keywords = chunk.readString(chunk.available()); + } else if (format.equals("IMED")) { + dlssample.info.medium = chunk.readString(chunk.available()); + } else if (format.equals("ISBJ")) { + dlssample.info.subject = chunk.readString(chunk.available()); + } else if (format.equals("ISRC")) { + dlssample.info.source = chunk.readString(chunk.available()); + } else if (format.equals("ISRF")) { + dlssample.info.source_form = chunk.readString(chunk.available()); + } else if (format.equals("ITCH")) { + dlssample.info.technician = chunk.readString(chunk.available()); + } + } + } + + public void save(String name) throws IOException { + writeSoundbank(new RIFFWriter(name, "DLS ")); + } + + public void save(File file) throws IOException { + writeSoundbank(new RIFFWriter(file, "DLS ")); + } + + public void save(OutputStream out) throws IOException { + writeSoundbank(new RIFFWriter(out, "DLS ")); + } + + private void writeSoundbank(RIFFWriter writer) throws IOException { + RIFFWriter colh_chunk = writer.writeChunk("colh"); + colh_chunk.writeUnsignedInt(instruments.size()); + + if (major != -1 && minor != -1) { + RIFFWriter vers_chunk = writer.writeChunk("vers"); + vers_chunk.writeUnsignedInt(major); + vers_chunk.writeUnsignedInt(minor); + } + + writeInstruments(writer.writeList("lins")); + + RIFFWriter ptbl = writer.writeChunk("ptbl"); + ptbl.writeUnsignedInt(8); + ptbl.writeUnsignedInt(samples.size()); + long ptbl_offset = writer.getFilePointer(); + for (int i = 0; i < samples.size(); i++) + ptbl.writeUnsignedInt(0); + + RIFFWriter wvpl = writer.writeList("wvpl"); + long off = wvpl.getFilePointer(); + List offsettable = new ArrayList(); + for (DLSSample sample : samples) { + offsettable.add(Long.valueOf(wvpl.getFilePointer() - off)); + writeSample(wvpl.writeList("wave"), sample); + } + + // small cheat, we are going to rewrite data back in wvpl + long bak = writer.getFilePointer(); + writer.seek(ptbl_offset); + writer.setWriteOverride(true); + for (Long offset : offsettable) + writer.writeUnsignedInt(offset.longValue()); + writer.setWriteOverride(false); + writer.seek(bak); + + writeInfo(writer.writeList("INFO"), info); + + writer.close(); + } + + private void writeSample(RIFFWriter writer, DLSSample sample) + throws IOException { + + AudioFormat audioformat = sample.getFormat(); + + Encoding encoding = audioformat.getEncoding(); + float sampleRate = audioformat.getSampleRate(); + int sampleSizeInBits = audioformat.getSampleSizeInBits(); + int channels = audioformat.getChannels(); + int frameSize = audioformat.getFrameSize(); + float frameRate = audioformat.getFrameRate(); + boolean bigEndian = audioformat.isBigEndian(); + + boolean convert_needed = false; + + if (audioformat.getSampleSizeInBits() == 8) { + if (!encoding.equals(Encoding.PCM_UNSIGNED)) { + encoding = Encoding.PCM_UNSIGNED; + convert_needed = true; + } + } else { + if (!encoding.equals(Encoding.PCM_SIGNED)) { + encoding = Encoding.PCM_SIGNED; + convert_needed = true; + } + if (bigEndian) { + bigEndian = false; + convert_needed = true; + } + } + + if (convert_needed) { + audioformat = new AudioFormat(encoding, sampleRate, + sampleSizeInBits, channels, frameSize, frameRate, bigEndian); + } + + // fmt + RIFFWriter fmt_chunk = writer.writeChunk("fmt "); + int sampleformat = 0; + if (audioformat.getEncoding().equals(Encoding.PCM_UNSIGNED)) + sampleformat = 1; + else if (audioformat.getEncoding().equals(Encoding.PCM_SIGNED)) + sampleformat = 1; + else if (audioformat.getEncoding().equals(AudioFloatConverter.PCM_FLOAT)) + sampleformat = 3; + + fmt_chunk.writeUnsignedShort(sampleformat); + fmt_chunk.writeUnsignedShort(audioformat.getChannels()); + fmt_chunk.writeUnsignedInt((long) audioformat.getSampleRate()); + long srate = ((long)audioformat.getFrameRate())*audioformat.getFrameSize(); + fmt_chunk.writeUnsignedInt(srate); + fmt_chunk.writeUnsignedShort(audioformat.getFrameSize()); + fmt_chunk.writeUnsignedShort(audioformat.getSampleSizeInBits()); + fmt_chunk.write(0); + fmt_chunk.write(0); + + writeSampleOptions(writer.writeChunk("wsmp"), sample.sampleoptions); + + if (convert_needed) { + RIFFWriter data_chunk = writer.writeChunk("data"); + AudioInputStream stream = AudioSystem.getAudioInputStream( + audioformat, (AudioInputStream)sample.getData()); + byte[] buff = new byte[1024]; + int ret; + while ((ret = stream.read(buff)) != -1) { + data_chunk.write(buff, 0, ret); + } + } else { + RIFFWriter data_chunk = writer.writeChunk("data"); + ModelByteBuffer databuff = sample.getDataBuffer(); + databuff.writeTo(data_chunk); + /* + data_chunk.write(databuff.array(), + databuff.arrayOffset(), + databuff.capacity()); + */ + } + + writeInfo(writer.writeList("INFO"), sample.info); + } + + private void writeInstruments(RIFFWriter writer) throws IOException { + for (DLSInstrument instrument : instruments) { + writeInstrument(writer.writeList("ins "), instrument); + } + } + + private void writeInstrument(RIFFWriter writer, DLSInstrument instrument) + throws IOException { + + int art1_count = 0; + int art2_count = 0; + for (DLSModulator modulator : instrument.getModulators()) { + if (modulator.version == 1) + art1_count++; + if (modulator.version == 2) + art2_count++; + } + for (DLSRegion region : instrument.regions) { + for (DLSModulator modulator : region.getModulators()) { + if (modulator.version == 1) + art1_count++; + if (modulator.version == 2) + art2_count++; + } + } + + int version = 1; + if (art2_count > 0) + version = 2; + + RIFFWriter insh_chunk = writer.writeChunk("insh"); + insh_chunk.writeUnsignedInt(instrument.getRegions().size()); + insh_chunk.writeUnsignedInt(instrument.bank + + (instrument.druminstrument ? 2147483648L : 0)); + insh_chunk.writeUnsignedInt(instrument.preset); + + RIFFWriter lrgn = writer.writeList("lrgn"); + for (DLSRegion region: instrument.regions) + writeRegion(lrgn, region, version); + + writeArticulators(writer, instrument.getModulators()); + + writeInfo(writer.writeList("INFO"), instrument.info); + + } + + private void writeArticulators(RIFFWriter writer, + List modulators) throws IOException { + int art1_count = 0; + int art2_count = 0; + for (DLSModulator modulator : modulators) { + if (modulator.version == 1) + art1_count++; + if (modulator.version == 2) + art2_count++; + } + if (art1_count > 0) { + RIFFWriter lar1 = writer.writeList("lart"); + RIFFWriter art1 = lar1.writeChunk("art1"); + art1.writeUnsignedInt(8); + art1.writeUnsignedInt(art1_count); + for (DLSModulator modulator : modulators) { + if (modulator.version == 1) { + art1.writeUnsignedShort(modulator.source); + art1.writeUnsignedShort(modulator.control); + art1.writeUnsignedShort(modulator.destination); + art1.writeUnsignedShort(modulator.transform); + art1.writeInt(modulator.scale); + } + } + } + if (art2_count > 0) { + RIFFWriter lar2 = writer.writeList("lar2"); + RIFFWriter art2 = lar2.writeChunk("art2"); + art2.writeUnsignedInt(8); + art2.writeUnsignedInt(art2_count); + for (DLSModulator modulator : modulators) { + if (modulator.version == 2) { + art2.writeUnsignedShort(modulator.source); + art2.writeUnsignedShort(modulator.control); + art2.writeUnsignedShort(modulator.destination); + art2.writeUnsignedShort(modulator.transform); + art2.writeInt(modulator.scale); + } + } + } + } + + private void writeRegion(RIFFWriter writer, DLSRegion region, int version) + throws IOException { + RIFFWriter rgns = null; + if (version == 1) + rgns = writer.writeList("rgn "); + if (version == 2) + rgns = writer.writeList("rgn2"); + if (rgns == null) + return; + + RIFFWriter rgnh = rgns.writeChunk("rgnh"); + rgnh.writeUnsignedShort(region.keyfrom); + rgnh.writeUnsignedShort(region.keyto); + rgnh.writeUnsignedShort(region.velfrom); + rgnh.writeUnsignedShort(region.velto); + rgnh.writeUnsignedShort(region.options); + rgnh.writeUnsignedShort(region.exclusiveClass); + + if (region.sampleoptions != null) + writeSampleOptions(rgns.writeChunk("wsmp"), region.sampleoptions); + + if (region.sample != null) { + if (samples.indexOf(region.sample) != -1) { + RIFFWriter wlnk = rgns.writeChunk("wlnk"); + wlnk.writeUnsignedShort(region.fusoptions); + wlnk.writeUnsignedShort(region.phasegroup); + wlnk.writeUnsignedInt(region.channel); + wlnk.writeUnsignedInt(samples.indexOf(region.sample)); + } + } + writeArticulators(rgns, region.getModulators()); + rgns.close(); + } + + private void writeSampleOptions(RIFFWriter wsmp, + DLSSampleOptions sampleoptions) throws IOException { + wsmp.writeUnsignedInt(20); + wsmp.writeUnsignedShort(sampleoptions.unitynote); + wsmp.writeShort(sampleoptions.finetune); + wsmp.writeInt(sampleoptions.attenuation); + wsmp.writeUnsignedInt(sampleoptions.options); + wsmp.writeInt(sampleoptions.loops.size()); + + for (DLSSampleLoop loop : sampleoptions.loops) { + wsmp.writeUnsignedInt(16); + wsmp.writeUnsignedInt(loop.type); + wsmp.writeUnsignedInt(loop.start); + wsmp.writeUnsignedInt(loop.length); + } + } + + private void writeInfoStringChunk(RIFFWriter writer, + String name, String value) throws IOException { + if (value == null) + return; + RIFFWriter chunk = writer.writeChunk(name); + chunk.writeString(value); + int len = value.getBytes("ascii").length; + chunk.write(0); + len++; + if (len % 2 != 0) + chunk.write(0); + } + + private void writeInfo(RIFFWriter writer, DLSInfo info) throws IOException { + writeInfoStringChunk(writer, "INAM", info.name); + writeInfoStringChunk(writer, "ICRD", info.creationDate); + writeInfoStringChunk(writer, "IENG", info.engineers); + writeInfoStringChunk(writer, "IPRD", info.product); + writeInfoStringChunk(writer, "ICOP", info.copyright); + writeInfoStringChunk(writer, "ICMT", info.comments); + writeInfoStringChunk(writer, "ISFT", info.tools); + writeInfoStringChunk(writer, "IARL", info.archival_location); + writeInfoStringChunk(writer, "IART", info.artist); + writeInfoStringChunk(writer, "ICMS", info.commissioned); + writeInfoStringChunk(writer, "IGNR", info.genre); + writeInfoStringChunk(writer, "IKEY", info.keywords); + writeInfoStringChunk(writer, "IMED", info.medium); + writeInfoStringChunk(writer, "ISBJ", info.subject); + writeInfoStringChunk(writer, "ISRC", info.source); + writeInfoStringChunk(writer, "ISRF", info.source_form); + writeInfoStringChunk(writer, "ITCH", info.technician); + } + + public DLSInfo getInfo() { + return info; + } + + public String getName() { + return info.name; + } + + public String getVersion() { + return major + "." + minor; + } + + public String getVendor() { + return info.engineers; + } + + public String getDescription() { + return info.comments; + } + + public void setName(String s) { + info.name = s; + } + + public void setVendor(String s) { + info.engineers = s; + } + + public void setDescription(String s) { + info.comments = s; + } + + public SoundbankResource[] getResources() { + SoundbankResource[] resources = new SoundbankResource[samples.size()]; + int j = 0; + for (int i = 0; i < samples.size(); i++) + resources[j++] = samples.get(i); + return resources; + } + + public DLSInstrument[] getInstruments() { + DLSInstrument[] inslist_array = + instruments.toArray(new DLSInstrument[instruments.size()]); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + + public DLSSample[] getSamples() { + return samples.toArray(new DLSSample[samples.size()]); + } + + public Instrument getInstrument(Patch patch) { + int program = patch.getProgram(); + int bank = patch.getBank(); + boolean percussion = false; + if (patch instanceof ModelPatch) + percussion = ((ModelPatch) patch).isPercussion(); + for (Instrument instrument : instruments) { + Patch patch2 = instrument.getPatch(); + int program2 = patch2.getProgram(); + int bank2 = patch2.getBank(); + if (program == program2 && bank == bank2) { + boolean percussion2 = false; + if (patch2 instanceof ModelPatch) + percussion2 = ((ModelPatch) patch2).isPercussion(); + if (percussion == percussion2) + return instrument; + } + } + return null; + } + + public void addResource(SoundbankResource resource) { + if (resource instanceof DLSInstrument) + instruments.add((DLSInstrument) resource); + if (resource instanceof DLSSample) + samples.add((DLSSample) resource); + } + + public void removeResource(SoundbankResource resource) { + if (resource instanceof DLSInstrument) + instruments.remove((DLSInstrument) resource); + if (resource instanceof DLSSample) + samples.remove((DLSSample) resource); + } + + public void addInstrument(DLSInstrument resource) { + instruments.add(resource); + } + + public void removeInstrument(DLSInstrument resource) { + instruments.remove(resource); + } + + public long getMajor() { + return major; + } + + public void setMajor(long major) { + this.major = major; + } + + public long getMinor() { + return minor; + } + + public void setMinor(long minor) { + this.minor = minor; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DLSSoundbankReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbankReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; + +/** + * This class is used to connect the DLSSoundBank class + * to the SoundbankReader SPI interface. + * + * @author Karl Helgason + */ +public class DLSSoundbankReader extends SoundbankReader { + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + try { + return new DLSSoundbank(url); + } catch (RIFFInvalidFormatException e) { + return null; + } catch(IOException ioe) { + return null; + } + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + try { + stream.mark(512); + return new DLSSoundbank(stream); + } catch (RIFFInvalidFormatException e) { + stream.reset(); + return null; + } + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + try { + return new DLSSoundbank(file); + } catch (RIFFInvalidFormatException e) { + return null; + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java --- a/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java Thu Feb 05 09:24:45 2009 -0800 @@ -394,7 +394,12 @@ private float leftGain, rightGain; protected volatile boolean noService = false; // do not run the nService method + // Guards all native calls. protected Object lockNative = new Object(); + // Guards the lastOpened static variable in implOpen and implClose. + protected static Object lockLast = new Object(); + // Keeps track of last opened line, see implOpen "trick". + protected static DirectDL lastOpened; // CONSTRUCTOR protected DirectDL(DataLine.Info info, @@ -496,20 +501,50 @@ // align buffer to full frames bufferSize = ((int) bufferSize / format.getFrameSize()) * format.getFrameSize(); - id = nOpen(mixerIndex, deviceID, isSource, - encoding, - hardwareFormat.getSampleRate(), - hardwareFormat.getSampleSizeInBits(), - hardwareFormat.getFrameSize(), - hardwareFormat.getChannels(), - hardwareFormat.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED), - hardwareFormat.isBigEndian(), - bufferSize); + synchronized(lockLast) { + id = nOpen(mixerIndex, deviceID, isSource, + encoding, + hardwareFormat.getSampleRate(), + hardwareFormat.getSampleSizeInBits(), + hardwareFormat.getFrameSize(), + hardwareFormat.getChannels(), + hardwareFormat.getEncoding().equals( + AudioFormat.Encoding.PCM_SIGNED), + hardwareFormat.isBigEndian(), + bufferSize); - if (id == 0) { - // TODO: nicer error messages... - throw new LineUnavailableException("line with format "+format+" not supported."); + if (id == 0) { + // Bah... Dirty trick. The most likely cause is an application + // already having a line open for this particular hardware + // format and forgetting about it. If so, silently close that + // implementation and try again. Unfortuantely we can only + // open one line per hardware format currently. + if (lastOpened != null + && hardwareFormat.matches(lastOpened.hardwareFormat)) { + lastOpened.implClose(); + lastOpened = null; + + id = nOpen(mixerIndex, deviceID, isSource, + encoding, + hardwareFormat.getSampleRate(), + hardwareFormat.getSampleSizeInBits(), + hardwareFormat.getFrameSize(), + hardwareFormat.getChannels(), + hardwareFormat.getEncoding().equals( + AudioFormat.Encoding.PCM_SIGNED), + hardwareFormat.isBigEndian(), + bufferSize); + } + + if (id == 0) { + // TODO: nicer error messages... + throw new LineUnavailableException( + "line with format "+format+" not supported."); + } + } + lastOpened = this; } + this.bufferSize = nGetBufferSize(id, isSource); if (this.bufferSize < 1) { // this is an error! @@ -580,12 +615,12 @@ } synchronized (lockNative) { nStop(id, isSource); + + // need to set doIO to false before notifying the + // read/write thread, that's why isStartedRunning() + // cannot be used + doIO = false; } - - // need to set doIO to false before notifying the - // read/write thread, that's why isStartedRunning() - // cannot be used - doIO = false; // wake up any waiting threads synchronized(lock) { lock.notifyAll(); @@ -614,8 +649,12 @@ doIO = false; long oldID = id; id = 0; - synchronized (lockNative) { - nClose(oldID, isSource); + synchronized (lockLast) { + synchronized (lockNative) { + nClose(oldID, isSource); + if (lastOpened == this) + lastOpened = null; + } } bytePosition = 0; softwareConversionSize = 0; @@ -630,7 +669,8 @@ } int a = 0; synchronized (lockNative) { - a = nAvailable(id, isSource); + if (doIO) + a = nAvailable(id, isSource); } return a; } @@ -644,9 +684,9 @@ int counter = 0; long startPos = getLongFramePosition(); boolean posChanged = false; - while (!drained && doIO) { + while (!drained) { synchronized (lockNative) { - if ((id == 0) || !nIsStillDraining(id, isSource)) + if ((id == 0) || (!doIO) || !nIsStillDraining(id, isSource)) break; } // check every now and then for a new position @@ -686,7 +726,7 @@ lock.notifyAll(); } synchronized (lockNative) { - if (id != 0) { + if (id != 0 && doIO) { // then flush native buffers nFlush(id, isSource); } @@ -697,9 +737,10 @@ // replacement for getFramePosition (see AbstractDataLine) public long getLongFramePosition() { - long pos; + long pos = 0; synchronized (lockNative) { - pos = nGetBytePosition(id, isSource, bytePosition); + if (doIO) + pos = nGetBytePosition(id, isSource, bytePosition); } // hack because ALSA sometimes reports wrong framepos if (pos < 0) { @@ -745,11 +786,12 @@ } int written = 0; while (!flushing) { - int thisWritten; + int thisWritten = 0; synchronized (lockNative) { - thisWritten = nWrite(id, b, off, len, - softwareConversionSize, - leftGain, rightGain); + if (doIO) + thisWritten = nWrite(id, b, off, len, + softwareConversionSize, + leftGain, rightGain); if (thisWritten < 0) { // error in native layer break; @@ -972,9 +1014,10 @@ } int read = 0; while (doIO && !flushing) { - int thisRead; + int thisRead = 0; synchronized (lockNative) { - thisRead = nRead(id, b, off, len, softwareConversionSize); + if (doIO) + thisRead = nRead(id, b, off, len, softwareConversionSize); if (thisRead < 0) { // error in native layer break; @@ -1209,7 +1252,8 @@ // set new native position (if necessary) // this must come after the flush! synchronized (lockNative) { - nSetBytePosition(id, isSource, frames * frameSize); + if (doIO) + nSetBytePosition(id, isSource, frames * frameSize); } if (Printer.debug) Printer.debug(" DirectClip.setFramePosition: " diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/EmergencySoundbank.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/EmergencySoundbank.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,2695 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Random; + +import javax.sound.midi.Patch; +import javax.sound.sampled.AudioFormat; + +/** + * Emergency Soundbank generator. + * Used when no other default soundbank can be found. + * + * @author Karl Helgason + */ +public class EmergencySoundbank { + + private final static String[] general_midi_instruments = { + "Acoustic Grand Piano", + "Bright Acoustic Piano", + "Electric Grand Piano", + "Honky-tonk Piano", + "Electric Piano 1", + "Electric Piano 2", + "Harpsichord", + "Clavi", + "Celesta", + "Glockenspiel", + "Music Box", + "Vibraphone", + "Marimba", + "Xylophone", + "Tubular Bells", + "Dulcimer", + "Drawbar Organ", + "Percussive Organ", + "Rock Organ", + "Church Organ", + "Reed Organ", + "Accordion", + "Harmonica", + "Tango Accordion", + "Acoustic Guitar (nylon)", + "Acoustic Guitar (steel)", + "Electric Guitar (jazz)", + "Electric Guitar (clean)", + "Electric Guitar (muted)", + "Overdriven Guitar", + "Distortion Guitar", + "Guitar harmonics", + "Acoustic Bass", + "Electric Bass (finger)", + "Electric Bass (pick)", + "Fretless Bass", + "Slap Bass 1", + "Slap Bass 2", + "Synth Bass 1", + "Synth Bass 2", + "Violin", + "Viola", + "Cello", + "Contrabass", + "Tremolo Strings", + "Pizzicato Strings", + "Orchestral Harp", + "Timpani", + "String Ensemble 1", + "String Ensemble 2", + "SynthStrings 1", + "SynthStrings 2", + "Choir Aahs", + "Voice Oohs", + "Synth Voice", + "Orchestra Hit", + "Trumpet", + "Trombone", + "Tuba", + "Muted Trumpet", + "French Horn", + "Brass Section", + "SynthBrass 1", + "SynthBrass 2", + "Soprano Sax", + "Alto Sax", + "Tenor Sax", + "Baritone Sax", + "Oboe", + "English Horn", + "Bassoon", + "Clarinet", + "Piccolo", + "Flute", + "Recorder", + "Pan Flute", + "Blown Bottle", + "Shakuhachi", + "Whistle", + "Ocarina", + "Lead 1 (square)", + "Lead 2 (sawtooth)", + "Lead 3 (calliope)", + "Lead 4 (chiff)", + "Lead 5 (charang)", + "Lead 6 (voice)", + "Lead 7 (fifths)", + "Lead 8 (bass + lead)", + "Pad 1 (new age)", + "Pad 2 (warm)", + "Pad 3 (polysynth)", + "Pad 4 (choir)", + "Pad 5 (bowed)", + "Pad 6 (metallic)", + "Pad 7 (halo)", + "Pad 8 (sweep)", + "FX 1 (rain)", + "FX 2 (soundtrack)", + "FX 3 (crystal)", + "FX 4 (atmosphere)", + "FX 5 (brightness)", + "FX 6 (goblins)", + "FX 7 (echoes)", + "FX 8 (sci-fi)", + "Sitar", + "Banjo", + "Shamisen", + "Koto", + "Kalimba", + "Bag pipe", + "Fiddle", + "Shanai", + "Tinkle Bell", + "Agogo", + "Steel Drums", + "Woodblock", + "Taiko Drum", + "Melodic Tom", + "Synth Drum", + "Reverse Cymbal", + "Guitar Fret Noise", + "Breath Noise", + "Seashore", + "Bird Tweet", + "Telephone Ring", + "Helicopter", + "Applause", + "Gunshot" + }; + + public static SF2Soundbank createSoundbank() throws Exception { + SF2Soundbank sf2 = new SF2Soundbank(); + sf2.setName("Emergency GM sound set"); + sf2.setVendor("Generated"); + sf2.setDescription("Emergency generated soundbank"); + + /* + * percussion instruments + */ + + SF2Layer bass_drum = new_bass_drum(sf2); + SF2Layer snare_drum = new_snare_drum(sf2); + SF2Layer tom = new_tom(sf2); + SF2Layer open_hihat = new_open_hihat(sf2); + SF2Layer closed_hihat = new_closed_hihat(sf2); + SF2Layer crash_cymbal = new_crash_cymbal(sf2); + SF2Layer side_stick = new_side_stick(sf2); + + SF2Layer[] drums = new SF2Layer[128]; + drums[35] = bass_drum; + drums[36] = bass_drum; + drums[38] = snare_drum; + drums[40] = snare_drum; + drums[41] = tom; + drums[43] = tom; + drums[45] = tom; + drums[47] = tom; + drums[48] = tom; + drums[50] = tom; + drums[42] = closed_hihat; + drums[44] = closed_hihat; + drums[46] = open_hihat; + drums[49] = crash_cymbal; + drums[51] = crash_cymbal; + drums[52] = crash_cymbal; + drums[55] = crash_cymbal; + drums[57] = crash_cymbal; + drums[59] = crash_cymbal; + + // Use side_stick for missing drums: + drums[37] = side_stick; + drums[39] = side_stick; + drums[53] = side_stick; + drums[54] = side_stick; + drums[56] = side_stick; + drums[58] = side_stick; + drums[69] = side_stick; + drums[70] = side_stick; + drums[75] = side_stick; + drums[60] = side_stick; + drums[61] = side_stick; + drums[62] = side_stick; + drums[63] = side_stick; + drums[64] = side_stick; + drums[65] = side_stick; + drums[66] = side_stick; + drums[67] = side_stick; + drums[68] = side_stick; + drums[71] = side_stick; + drums[72] = side_stick; + drums[73] = side_stick; + drums[74] = side_stick; + drums[76] = side_stick; + drums[77] = side_stick; + drums[78] = side_stick; + drums[79] = side_stick; + drums[80] = side_stick; + drums[81] = side_stick; + + + SF2Instrument drum_instrument = new SF2Instrument(sf2); + drum_instrument.setName("Standard Kit"); + drum_instrument.setPatch(new ModelPatch(0, 0, true)); + sf2.addInstrument(drum_instrument); + for (int i = 0; i < drums.length; i++) { + if (drums[i] != null) { + SF2InstrumentRegion region = new SF2InstrumentRegion(); + region.setLayer(drums[i]); + region.putBytes(SF2InstrumentRegion.GENERATOR_KEYRANGE, + new byte[]{(byte) i, (byte) i}); + drum_instrument.getRegions().add(region); + } + } + + + /* + * melodic instruments + */ + + SF2Layer gpiano = new_gpiano(sf2); + SF2Layer gpiano2 = new_gpiano2(sf2); + SF2Layer gpiano_hammer = new_piano_hammer(sf2); + SF2Layer piano1 = new_piano1(sf2); + SF2Layer epiano1 = new_epiano1(sf2); + SF2Layer epiano2 = new_epiano2(sf2); + + SF2Layer guitar = new_guitar1(sf2); + SF2Layer guitar_pick = new_guitar_pick(sf2); + SF2Layer guitar_dist = new_guitar_dist(sf2); + SF2Layer bass1 = new_bass1(sf2); + SF2Layer bass2 = new_bass2(sf2); + SF2Layer synthbass = new_synthbass(sf2); + SF2Layer string2 = new_string2(sf2); + SF2Layer orchhit = new_orchhit(sf2); + SF2Layer choir = new_choir(sf2); + SF2Layer solostring = new_solostring(sf2); + SF2Layer organ = new_organ(sf2); + SF2Layer ch_organ = new_ch_organ(sf2); + SF2Layer bell = new_bell(sf2); + SF2Layer flute = new_flute(sf2); + + SF2Layer timpani = new_timpani(sf2); + SF2Layer melodic_toms = new_melodic_toms(sf2); + SF2Layer trumpet = new_trumpet(sf2); + SF2Layer trombone = new_trombone(sf2); + SF2Layer brass_section = new_brass_section(sf2); + SF2Layer horn = new_horn(sf2); + SF2Layer sax = new_sax(sf2); + SF2Layer oboe = new_oboe(sf2); + SF2Layer bassoon = new_bassoon(sf2); + SF2Layer clarinet = new_clarinet(sf2); + SF2Layer reverse_cymbal = new_reverse_cymbal(sf2); + + SF2Layer defaultsound = piano1; + + newInstrument(sf2, "Piano", new Patch(0, 0), gpiano, gpiano_hammer); + newInstrument(sf2, "Piano", new Patch(0, 1), gpiano2, gpiano_hammer); + newInstrument(sf2, "Piano", new Patch(0, 2), piano1); + { + SF2Instrument ins = newInstrument(sf2, "Honky-tonk Piano", + new Patch(0, 3), piano1, piano1); + SF2InstrumentRegion region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 80); + region.putInteger(SF2Region.GENERATOR_FINETUNE, 30); + region = ins.getRegions().get(1); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 30); + } + newInstrument(sf2, "Rhodes", new Patch(0, 4), epiano2); + newInstrument(sf2, "Rhodes", new Patch(0, 5), epiano2); + newInstrument(sf2, "Clavinet", new Patch(0, 6), epiano1); + newInstrument(sf2, "Clavinet", new Patch(0, 7), epiano1); + newInstrument(sf2, "Rhodes", new Patch(0, 8), epiano2); + newInstrument(sf2, "Bell", new Patch(0, 9), bell); + newInstrument(sf2, "Bell", new Patch(0, 10), bell); + newInstrument(sf2, "Vibraphone", new Patch(0, 11), bell); + newInstrument(sf2, "Marimba", new Patch(0, 12), bell); + newInstrument(sf2, "Marimba", new Patch(0, 13), bell); + newInstrument(sf2, "Bell", new Patch(0, 14), bell); + newInstrument(sf2, "Rock Organ", new Patch(0, 15), organ); + newInstrument(sf2, "Rock Organ", new Patch(0, 16), organ); + newInstrument(sf2, "Perc Organ", new Patch(0, 17), organ); + newInstrument(sf2, "Rock Organ", new Patch(0, 18), organ); + newInstrument(sf2, "Church Organ", new Patch(0, 19), ch_organ); + newInstrument(sf2, "Accordion", new Patch(0, 20), organ); + newInstrument(sf2, "Accordion", new Patch(0, 21), organ); + newInstrument(sf2, "Accordion", new Patch(0, 22), organ); + newInstrument(sf2, "Accordion", new Patch(0, 23), organ); + newInstrument(sf2, "Guitar", new Patch(0, 24), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 25), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 26), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 27), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 28), guitar, guitar_pick); + newInstrument(sf2, "Distorted Guitar", new Patch(0, 29), guitar_dist); + newInstrument(sf2, "Distorted Guitar", new Patch(0, 30), guitar_dist); + newInstrument(sf2, "Guitar", new Patch(0, 31), guitar, guitar_pick); + newInstrument(sf2, "Finger Bass", new Patch(0, 32), bass1); + newInstrument(sf2, "Finger Bass", new Patch(0, 33), bass1); + newInstrument(sf2, "Finger Bass", new Patch(0, 34), bass1); + newInstrument(sf2, "Frettless Bass", new Patch(0, 35), bass2); + newInstrument(sf2, "Frettless Bass", new Patch(0, 36), bass2); + newInstrument(sf2, "Frettless Bass", new Patch(0, 37), bass2); + newInstrument(sf2, "Synth Bass1", new Patch(0, 38), synthbass); + newInstrument(sf2, "Synth Bass2", new Patch(0, 39), synthbass); + newInstrument(sf2, "Solo String", new Patch(0, 40), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 41), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 42), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 43), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 44), string2, solostring); + newInstrument(sf2, "Def", new Patch(0, 45), defaultsound); + newInstrument(sf2, "Harp", new Patch(0, 46), bell); + newInstrument(sf2, "Timpani", new Patch(0, 47), timpani); + newInstrument(sf2, "Strings", new Patch(0, 48), string2); + SF2Instrument slow_strings = + newInstrument(sf2, "Slow Strings", new Patch(0, 49), string2); + SF2InstrumentRegion region = slow_strings.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, 2500); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 2000); + newInstrument(sf2, "Synth Strings", new Patch(0, 50), string2); + newInstrument(sf2, "Synth Strings", new Patch(0, 51), string2); + + + newInstrument(sf2, "Choir", new Patch(0, 52), choir); + newInstrument(sf2, "Choir", new Patch(0, 53), choir); + newInstrument(sf2, "Choir", new Patch(0, 54), choir); + { + SF2Instrument ins = newInstrument(sf2, "Orch Hit", + new Patch(0, 55), orchhit, orchhit, timpani); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_COARSETUNE, -12); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + } + newInstrument(sf2, "Trumpet", new Patch(0, 56), trumpet); + newInstrument(sf2, "Trombone", new Patch(0, 57), trombone); + newInstrument(sf2, "Trombone", new Patch(0, 58), trombone); + newInstrument(sf2, "Trumpet", new Patch(0, 59), trumpet); + newInstrument(sf2, "Horn", new Patch(0, 60), horn); + newInstrument(sf2, "Brass Section", new Patch(0, 61), brass_section); + newInstrument(sf2, "Brass Section", new Patch(0, 62), brass_section); + newInstrument(sf2, "Brass Section", new Patch(0, 63), brass_section); + newInstrument(sf2, "Sax", new Patch(0, 64), sax); + newInstrument(sf2, "Sax", new Patch(0, 65), sax); + newInstrument(sf2, "Sax", new Patch(0, 66), sax); + newInstrument(sf2, "Sax", new Patch(0, 67), sax); + newInstrument(sf2, "Oboe", new Patch(0, 68), oboe); + newInstrument(sf2, "Horn", new Patch(0, 69), horn); + newInstrument(sf2, "Bassoon", new Patch(0, 70), bassoon); + newInstrument(sf2, "Clarinet", new Patch(0, 71), clarinet); + newInstrument(sf2, "Flute", new Patch(0, 72), flute); + newInstrument(sf2, "Flute", new Patch(0, 73), flute); + newInstrument(sf2, "Flute", new Patch(0, 74), flute); + newInstrument(sf2, "Flute", new Patch(0, 75), flute); + newInstrument(sf2, "Flute", new Patch(0, 76), flute); + newInstrument(sf2, "Flute", new Patch(0, 77), flute); + newInstrument(sf2, "Flute", new Patch(0, 78), flute); + newInstrument(sf2, "Flute", new Patch(0, 79), flute); + newInstrument(sf2, "Organ", new Patch(0, 80), organ); + newInstrument(sf2, "Organ", new Patch(0, 81), organ); + newInstrument(sf2, "Flute", new Patch(0, 82), flute); + newInstrument(sf2, "Organ", new Patch(0, 83), organ); + newInstrument(sf2, "Organ", new Patch(0, 84), organ); + newInstrument(sf2, "Choir", new Patch(0, 85), choir); + newInstrument(sf2, "Organ", new Patch(0, 86), organ); + newInstrument(sf2, "Organ", new Patch(0, 87), organ); + newInstrument(sf2, "Synth Strings", new Patch(0, 88), string2); + newInstrument(sf2, "Organ", new Patch(0, 89), organ); + newInstrument(sf2, "Def", new Patch(0, 90), defaultsound); + newInstrument(sf2, "Choir", new Patch(0, 91), choir); + newInstrument(sf2, "Organ", new Patch(0, 92), organ); + newInstrument(sf2, "Organ", new Patch(0, 93), organ); + newInstrument(sf2, "Organ", new Patch(0, 94), organ); + newInstrument(sf2, "Organ", new Patch(0, 95), organ); + newInstrument(sf2, "Organ", new Patch(0, 96), organ); + newInstrument(sf2, "Organ", new Patch(0, 97), organ); + newInstrument(sf2, "Bell", new Patch(0, 98), bell); + newInstrument(sf2, "Organ", new Patch(0, 99), organ); + newInstrument(sf2, "Organ", new Patch(0, 100), organ); + newInstrument(sf2, "Organ", new Patch(0, 101), organ); + newInstrument(sf2, "Def", new Patch(0, 102), defaultsound); + newInstrument(sf2, "Synth Strings", new Patch(0, 103), string2); + newInstrument(sf2, "Def", new Patch(0, 104), defaultsound); + newInstrument(sf2, "Def", new Patch(0, 105), defaultsound); + newInstrument(sf2, "Def", new Patch(0, 106), defaultsound); + newInstrument(sf2, "Def", new Patch(0, 107), defaultsound); + newInstrument(sf2, "Marimba", new Patch(0, 108), bell); + newInstrument(sf2, "Sax", new Patch(0, 109), sax); + newInstrument(sf2, "Solo String", new Patch(0, 110), string2, solostring); + newInstrument(sf2, "Oboe", new Patch(0, 111), oboe); + newInstrument(sf2, "Bell", new Patch(0, 112), bell); + newInstrument(sf2, "Melodic Toms", new Patch(0, 113), melodic_toms); + newInstrument(sf2, "Marimba", new Patch(0, 114), bell); + newInstrument(sf2, "Melodic Toms", new Patch(0, 115), melodic_toms); + newInstrument(sf2, "Melodic Toms", new Patch(0, 116), melodic_toms); + newInstrument(sf2, "Melodic Toms", new Patch(0, 117), melodic_toms); + newInstrument(sf2, "Reverse Cymbal", new Patch(0, 118), reverse_cymbal); + newInstrument(sf2, "Reverse Cymbal", new Patch(0, 119), reverse_cymbal); + newInstrument(sf2, "Guitar", new Patch(0, 120), guitar); + newInstrument(sf2, "Def", new Patch(0, 121), defaultsound); + { + SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal", + new Patch(0, 122), reverse_cymbal); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500); + } + { + SF2Instrument ins = newInstrument(sf2, "Bird/Flute", + new Patch(0, 123), flute); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_COARSETUNE, 24); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -3000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + } + newInstrument(sf2, "Def", new Patch(0, 124), side_stick); + { + SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal", + new Patch(0, 125), reverse_cymbal); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500); + } + newInstrument(sf2, "Applause/crash_cymbal", + new Patch(0, 126), crash_cymbal); + newInstrument(sf2, "Gunshot/side_stick", new Patch(0, 127), side_stick); + + for (SF2Instrument instrument : sf2.getInstruments()) { + Patch patch = instrument.getPatch(); + if (patch instanceof ModelPatch) { + if (((ModelPatch) patch).isPercussion()) + continue; + } + instrument.setName(general_midi_instruments[patch.getProgram()]); + } + + return sf2; + + } + + public static SF2Layer new_bell(SF2Soundbank sf2) { + Random random = new Random(102030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.00001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double detune = 1 + (random.nextDouble() * 2 - 1) * 0.01; + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1) * detune, w, a); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + return layer; + } + + public static SF2Layer new_guitar1(SF2Soundbank sf2) { + + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 2; + double end_a = 0.01; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + double[] aa = new double[40]; + for (int i = 0; i < 40; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] = 2; + aa[1] = 0.5; + aa[2] = 0.45; + aa[3] = 0.2; + aa[4] = 1; + aa[5] = 0.5; + aa[6] = 2; + aa[7] = 1; + aa[8] = 0.5; + aa[9] = 1; + aa[9] = 0.5; + aa[10] = 0.2; + aa[11] = 1; + aa[12] = 0.7; + aa[13] = 0.5; + aa[14] = 1; + + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Guitar", data, base); + SF2Layer layer = newLayer(sf2, "Guitar", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -6000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20); + return layer; + } + + public static SF2Layer new_guitar_dist(SF2Soundbank sf2) { + + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 2; + double end_a = 0.01; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + double[] aa = new double[40]; + for (int i = 0; i < 40; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] = 5; + aa[1] = 2; + aa[2] = 0.45; + aa[3] = 0.2; + aa[4] = 1; + aa[5] = 0.5; + aa[6] = 2; + aa[7] = 1; + aa[8] = 0.5; + aa[9] = 1; + aa[9] = 0.5; + aa[10] = 0.2; + aa[11] = 1; + aa[12] = 0.7; + aa[13] = 0.5; + aa[14] = 1; + + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample_dist(sf2, "Distorted Guitar", + data, base, 10000.0); + + + SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + //region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400); + //region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200); + + //region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100); + //region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + //region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000); + //region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20); + return layer; + } + + public static SF2Layer new_guitar_pick(SF2Soundbank sf2) { + + double datab[]; + + // Make treble part + { + int m = 2; + int fftlen = 4096 * m; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 2048 * m; i++) { + data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2) + + Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9); + } + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.8); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9994; + } + datab = data; + + fadeUp(data, 80); + } + + SF2Sample sample = newSimpleDrumSample(sf2, "Guitar Noise", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Guitar Noise"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); +// region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); +/* + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0); + region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000); + */ + + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_gpiano(SF2Soundbank sf2) { + //Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 15.0); + + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 2; + //aa[2] *= 0.1; + aa[4] *= 2; + + + aa[12] *= 0.9; + aa[13] *= 0.7; + for (int i = 14; i < 30; i++) { + aa[i] *= 0.5; + } + + + for (int i = 0; i < 30; i++) { + //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001; + double w = 0.2; + double ai = aa[i]; + if (i > 10) { + w = 5; + ai *= 10; + } + int adjust = 0; + if (i > 5) { + adjust = (i - 5) * 7; + } + complexGaussianDist(data, base * (i + 1) + adjust, w, ai); + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200); + SF2Layer layer = newLayer(sf2, "Grand Piano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000); + return layer; + } + + public static SF2Layer new_gpiano2(SF2Soundbank sf2) { + //Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 20.0); + + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 1; + //aa[2] *= 0.1; + aa[4] *= 2; + + + aa[12] *= 0.9; + aa[13] *= 0.7; + for (int i = 14; i < 30; i++) { + aa[i] *= 0.5; + } + + + for (int i = 0; i < 30; i++) { + //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001; + double w = 0.2; + double ai = aa[i]; + if (i > 10) { + w = 5; + ai *= 10; + } + int adjust = 0; + if (i > 5) { + adjust = (i - 5) * 7; + } + complexGaussianDist(data, base * (i + 1) + adjust, w, ai); + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200); + SF2Layer layer = newLayer(sf2, "Grand Piano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000); + return layer; + } + + public static SF2Layer new_piano_hammer(SF2Soundbank sf2) { + + double datab[]; + + // Make treble part + { + int m = 2; + int fftlen = 4096 * m; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 2048 * m; i++) + data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.6); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9997; + } + datab = data; + + fadeUp(data, 80); + } + + SF2Sample sample = newSimpleDrumSample(sf2, "Piano Hammer", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Piano Hammer"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); +/* + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0); + region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000); + */ + + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_piano1(SF2Soundbank sf2) { + //Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_a = 0.2; + double end_a = 0.0001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 5; + aa[2] *= 0.1; + aa[7] *= 5; + + + for (int i = 0; i < 30; i++) { + //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001; + double w = 0.2; + double ai = aa[i]; + if (i > 12) { + w = 5; + ai *= 10; + } + int adjust = 0; + if (i > 5) { + adjust = (i - 5) * 7; + } + complexGaussianDist(data, base * (i + 1) + adjust, w, ai); + } + + complexGaussianDist(data, base * (15.5), 1, 0.1); + complexGaussianDist(data, base * (17.5), 1, 0.01); + + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base, 200); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -1200); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + return layer; + } + + public static SF2Layer new_epiano1(SF2Soundbank sf2) { + Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.0001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001; + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1) * detune, w, a); + a *= a_step; + } + + + + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + return layer; + } + + public static SF2Layer new_epiano2(SF2Soundbank sf2) { + Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.00001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001; + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1) * detune, w, a); + a *= a_step; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 8000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 2400); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_bass1(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.02; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 25.0); + + double[] aa = new double[25]; + for (int i = 0; i < 25; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 8; + aa[1] *= 4; + aa[3] *= 8; + aa[5] *= 8; + + for (int i = 0; i < 25; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base); + SF2Layer layer = newLayer(sf2, "Bass", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 11000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_synthbass(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.02; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 25.0); + + double[] aa = new double[25]; + for (int i = 0; i < 25; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 16; + aa[1] *= 4; + aa[3] *= 16; + aa[5] *= 8; + + for (int i = 0; i < 25; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base); + SF2Layer layer = newLayer(sf2, "Bass", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -3000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_bass2(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.002; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 25.0); + + double[] aa = new double[25]; + for (int i = 0; i < 25; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 8; + aa[1] *= 4; + aa[3] *= 8; + aa[5] *= 8; + + for (int i = 0; i < 25; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample(sf2, "Bass2", data, base); + SF2Layer layer = newLayer(sf2, "Bass2", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_solostring(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 2; + double start_a = 0.2; + double end_a = 0.01; + + double[] aa = new double[18]; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < aa.length; i++) { + a *= a_step; + aa[i] = a; + } + + aa[0] *= 5; + aa[1] *= 5; + aa[2] *= 5; + aa[3] *= 4; + aa[4] *= 4; + aa[5] *= 3; + aa[6] *= 3; + aa[7] *= 2; + + for (int i = 0; i < aa.length; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, a); + } + SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base); + SF2Layer layer = newLayer(sf2, "Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + region.putInteger(SF2Region.GENERATOR_FREQVIBLFO, -1000); + region.putInteger(SF2Region.GENERATOR_VIBLFOTOPITCH, 15); + return layer; + + } + + public static SF2Layer new_orchhit(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 80; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, a); + a *= a_step; + } + complexGaussianDist(data, base * 4, 300, 1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Och Strings", data, base); + SF2Layer layer = newLayer(sf2, "Och Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 200); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 200); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_string2(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 80; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, a); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base); + SF2Layer layer = newLayer(sf2, "Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_choir(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 80; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + double[] aa = new double[40]; + for (int i = 0; i < aa.length; i++) { + a *= a_step; + aa[i] = a; + } + + aa[5] *= 0.1; + aa[6] *= 0.01; + aa[7] *= 0.1; + aa[8] *= 0.1; + + for (int i = 0; i < aa.length; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base); + SF2Layer layer = newLayer(sf2, "Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_organ(SF2Soundbank sf2) { + Random random = new Random(102030201); + int x = 1; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + for (int i = 0; i < 12; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, + a * (0.5 + 3 * (random.nextDouble()))); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base); + SF2Layer layer = newLayer(sf2, "Organ", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_ch_organ(SF2Soundbank sf2) { + int x = 1; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 60.0); + + double[] aa = new double[60]; + for (int i = 0; i < aa.length; i++) { + a *= a_step; + aa[i] = a; + } + + aa[0] *= 5; + aa[1] *= 2; + aa[2] = 0; + aa[4] = 0; + aa[5] = 0; + aa[7] *= 7; + aa[9] = 0; + aa[10] = 0; + aa[12] = 0; + aa[15] *= 7; + aa[18] = 0; + aa[20] = 0; + aa[24] = 0; + aa[27] *= 5; + aa[29] = 0; + aa[30] = 0; + aa[33] = 0; + aa[36] *= 4; + aa[37] = 0; + aa[39] = 0; + aa[42] = 0; + aa[43] = 0; + aa[47] = 0; + aa[50] *= 4; + aa[52] = 0; + aa[55] = 0; + aa[57] = 0; + + + aa[10] *= 0.1; + aa[11] *= 0.1; + aa[12] *= 0.1; + aa[13] *= 0.1; + + aa[17] *= 0.1; + aa[18] *= 0.1; + aa[19] *= 0.1; + aa[20] *= 0.1; + + for (int i = 0; i < 60; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base); + SF2Layer layer = newLayer(sf2, "Organ", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + return layer; + + } + + public static SF2Layer new_flute(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 1, 0.001, 0.5); + complexGaussianDist(data, base * 2, 0.001, 0.5); + complexGaussianDist(data, base * 3, 0.001, 0.5); + complexGaussianDist(data, base * 4, 0.01, 0.5); + + complexGaussianDist(data, base * 4, 100, 120); + complexGaussianDist(data, base * 6, 100, 40); + complexGaussianDist(data, base * 8, 100, 80); + + complexGaussianDist(data, base * 5, 0.001, 0.05); + complexGaussianDist(data, base * 6, 0.001, 0.06); + complexGaussianDist(data, base * 7, 0.001, 0.04); + complexGaussianDist(data, base * 8, 0.005, 0.06); + complexGaussianDist(data, base * 9, 0.005, 0.06); + complexGaussianDist(data, base * 10, 0.01, 0.1); + complexGaussianDist(data, base * 11, 0.08, 0.7); + complexGaussianDist(data, base * 12, 0.08, 0.6); + complexGaussianDist(data, base * 13, 0.08, 0.6); + complexGaussianDist(data, base * 14, 0.08, 0.6); + complexGaussianDist(data, base * 15, 0.08, 0.5); + complexGaussianDist(data, base * 16, 0.08, 0.5); + complexGaussianDist(data, base * 17, 0.08, 0.2); + + + complexGaussianDist(data, base * 1, 10, 8); + complexGaussianDist(data, base * 2, 10, 8); + complexGaussianDist(data, base * 3, 10, 8); + complexGaussianDist(data, base * 4, 10, 8); + complexGaussianDist(data, base * 5, 10, 8); + complexGaussianDist(data, base * 6, 20, 9); + complexGaussianDist(data, base * 7, 20, 9); + complexGaussianDist(data, base * 8, 20, 9); + complexGaussianDist(data, base * 9, 20, 8); + complexGaussianDist(data, base * 10, 30, 8); + complexGaussianDist(data, base * 11, 30, 9); + complexGaussianDist(data, base * 12, 30, 9); + complexGaussianDist(data, base * 13, 30, 8); + complexGaussianDist(data, base * 14, 30, 8); + complexGaussianDist(data, base * 15, 30, 7); + complexGaussianDist(data, base * 16, 30, 7); + complexGaussianDist(data, base * 17, 30, 6); + + SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base); + SF2Layer layer = newLayer(sf2, "Flute", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_horn(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.00000000001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + if (i == 0) + complexGaussianDist(data, base * (i + 1), 0.1, a * 0.2); + else + complexGaussianDist(data, base * (i + 1), 0.1, a); + a *= a_step; + } + + complexGaussianDist(data, base * 2, 100, 1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Horn", data, base); + SF2Layer layer = newLayer(sf2, "Horn", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -500); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + return layer; + + } + + public static SF2Layer new_trumpet(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.00001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 80.0); + double[] aa = new double[80]; + for (int i = 0; i < 80; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 0.05; + aa[1] *= 0.2; + aa[2] *= 0.5; + aa[3] *= 0.85; + + for (int i = 0; i < 80; i++) { + complexGaussianDist(data, base * (i + 1), 0.1, aa[i]); + } + + complexGaussianDist(data, base * 5, 300, 3); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Trumpet", data, base); + SF2Layer layer = newLayer(sf2, "Trumpet", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -4000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, -2500); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10); + return layer; + + } + + public static SF2Layer new_brass_section(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.005; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 30.0); + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 0.8; + aa[1] *= 0.9; + + double w = 5; + for (int i = 0; i < 30; i++) { + complexGaussianDist(data, base * (i + 1), 0.1 * w, aa[i] * w); + w += 6; //*= w_step; + } + + complexGaussianDist(data, base * 6, 300, 2); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Brass Section", data, base); + SF2Layer layer = newLayer(sf2, "Brass Section", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -9200); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + return layer; + + } + + public static SF2Layer new_trombone(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 80.0); + double[] aa = new double[80]; + for (int i = 0; i < 80; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 0.3; + aa[1] *= 0.7; + + for (int i = 0; i < 80; i++) { + complexGaussianDist(data, base * (i + 1), 0.1, aa[i]); + } + + complexGaussianDist(data, base * 6, 300, 2); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Trombone", data, base); + SF2Layer layer = newLayer(sf2, "Trombone", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -2000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10); + return layer; + + } + + public static SF2Layer new_sax(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.01; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + if (i == 0 || i == 2) + complexGaussianDist(data, base * (i + 1), 0.1, a * 4); + else + complexGaussianDist(data, base * (i + 1), 0.1, a); + a *= a_step; + } + + complexGaussianDist(data, base * 4, 200, 1); + + SF2Sample sample = newSimpleFFTSample(sf2, "Sax", data, base); + SF2Layer layer = newLayer(sf2, "Sax", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + return layer; + + } + + public static SF2Layer new_oboe(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 5, 100, 80); + + + complexGaussianDist(data, base * 1, 0.01, 0.53); + complexGaussianDist(data, base * 2, 0.01, 0.51); + complexGaussianDist(data, base * 3, 0.01, 0.48); + complexGaussianDist(data, base * 4, 0.01, 0.49); + complexGaussianDist(data, base * 5, 0.01, 5); + complexGaussianDist(data, base * 6, 0.01, 0.51); + complexGaussianDist(data, base * 7, 0.01, 0.50); + complexGaussianDist(data, base * 8, 0.01, 0.59); + complexGaussianDist(data, base * 9, 0.01, 0.61); + complexGaussianDist(data, base * 10, 0.01, 0.52); + complexGaussianDist(data, base * 11, 0.01, 0.49); + complexGaussianDist(data, base * 12, 0.01, 0.51); + complexGaussianDist(data, base * 13, 0.01, 0.48); + complexGaussianDist(data, base * 14, 0.01, 0.51); + complexGaussianDist(data, base * 15, 0.01, 0.46); + complexGaussianDist(data, base * 16, 0.01, 0.35); + complexGaussianDist(data, base * 17, 0.01, 0.20); + complexGaussianDist(data, base * 18, 0.01, 0.10); + complexGaussianDist(data, base * 19, 0.01, 0.5); + complexGaussianDist(data, base * 20, 0.01, 0.1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Oboe", data, base); + SF2Layer layer = newLayer(sf2, "Oboe", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_bassoon(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 2, 100, 40); + complexGaussianDist(data, base * 4, 100, 20); + + complexGaussianDist(data, base * 1, 0.01, 0.53); + complexGaussianDist(data, base * 2, 0.01, 5); + complexGaussianDist(data, base * 3, 0.01, 0.51); + complexGaussianDist(data, base * 4, 0.01, 0.48); + complexGaussianDist(data, base * 5, 0.01, 1.49); + complexGaussianDist(data, base * 6, 0.01, 0.51); + complexGaussianDist(data, base * 7, 0.01, 0.50); + complexGaussianDist(data, base * 8, 0.01, 0.59); + complexGaussianDist(data, base * 9, 0.01, 0.61); + complexGaussianDist(data, base * 10, 0.01, 0.52); + complexGaussianDist(data, base * 11, 0.01, 0.49); + complexGaussianDist(data, base * 12, 0.01, 0.51); + complexGaussianDist(data, base * 13, 0.01, 0.48); + complexGaussianDist(data, base * 14, 0.01, 0.51); + complexGaussianDist(data, base * 15, 0.01, 0.46); + complexGaussianDist(data, base * 16, 0.01, 0.35); + complexGaussianDist(data, base * 17, 0.01, 0.20); + complexGaussianDist(data, base * 18, 0.01, 0.10); + complexGaussianDist(data, base * 19, 0.01, 0.5); + complexGaussianDist(data, base * 20, 0.01, 0.1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base); + SF2Layer layer = newLayer(sf2, "Flute", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_clarinet(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 1, 0.001, 0.5); + complexGaussianDist(data, base * 2, 0.001, 0.02); + complexGaussianDist(data, base * 3, 0.001, 0.2); + complexGaussianDist(data, base * 4, 0.01, 0.1); + + complexGaussianDist(data, base * 4, 100, 60); + complexGaussianDist(data, base * 6, 100, 20); + complexGaussianDist(data, base * 8, 100, 20); + + complexGaussianDist(data, base * 5, 0.001, 0.1); + complexGaussianDist(data, base * 6, 0.001, 0.09); + complexGaussianDist(data, base * 7, 0.001, 0.02); + complexGaussianDist(data, base * 8, 0.005, 0.16); + complexGaussianDist(data, base * 9, 0.005, 0.96); + complexGaussianDist(data, base * 10, 0.01, 0.9); + complexGaussianDist(data, base * 11, 0.08, 1.2); + complexGaussianDist(data, base * 12, 0.08, 1.8); + complexGaussianDist(data, base * 13, 0.08, 1.6); + complexGaussianDist(data, base * 14, 0.08, 1.2); + complexGaussianDist(data, base * 15, 0.08, 0.9); + complexGaussianDist(data, base * 16, 0.08, 0.5); + complexGaussianDist(data, base * 17, 0.08, 0.2); + + + complexGaussianDist(data, base * 1, 10, 8); + complexGaussianDist(data, base * 2, 10, 8); + complexGaussianDist(data, base * 3, 10, 8); + complexGaussianDist(data, base * 4, 10, 8); + complexGaussianDist(data, base * 5, 10, 8); + complexGaussianDist(data, base * 6, 20, 9); + complexGaussianDist(data, base * 7, 20, 9); + complexGaussianDist(data, base * 8, 20, 9); + complexGaussianDist(data, base * 9, 20, 8); + complexGaussianDist(data, base * 10, 30, 8); + complexGaussianDist(data, base * 11, 30, 9); + complexGaussianDist(data, base * 12, 30, 9); + complexGaussianDist(data, base * 13, 30, 8); + complexGaussianDist(data, base * 14, 30, 8); + complexGaussianDist(data, base * 15, 30, 7); + complexGaussianDist(data, base * 16, 30, 7); + complexGaussianDist(data, base * 17, 30, 6); + + SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base); + SF2Layer layer = newLayer(sf2, "Clarinet", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_timpani(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 8; + double[] data = new double[2 * fftlen]; + double base = 48; + complexGaussianDist(data, base * 2, 0.2, 1); + complexGaussianDist(data, base * 3, 0.2, 0.7); + complexGaussianDist(data, base * 5, 10, 1); + complexGaussianDist(data, base * 6, 9, 1); + complexGaussianDist(data, base * 8, 15, 1); + complexGaussianDist(data, base * 9, 18, 0.8); + complexGaussianDist(data, base * 11, 21, 0.5); + complexGaussianDist(data, base * 13, 28, 0.3); + complexGaussianDist(data, base * 14, 22, 0.1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.5); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) { + double g = (1.0 - (i / d_len)); + data[i] *= g * g; + } + fadeUp(data, 40); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) { + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + } + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 300; i++) { + double g = (1.0 - (i / 300.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 24; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9998; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.02; + + normalize(datab, 0.9); + + SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Timpani"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_melodic_toms(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 30, 0.5, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.8); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 200; i++) { + double g = (1.0 - (i / 200.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 30; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.5; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + normalize(datab, 0.99); + + SF2Sample sample = newSimpleDrumSample(sf2, "Melodic Toms", datab); + sample.setOriginalPitch(63); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Melodic Toms"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) { + double datah[]; + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 100; i++) + data[i] = 0; + + for (int i = 0; i < 512 * 2; i++) { + double gain = (i / (512.0 * 2.0)); + data[i] = 1 - gain; + } + datah = data; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal", + datah, 100, 20); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Reverse Cymbal"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_snare_drum(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 24, 0.5, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.5); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 300; i++) { + double g = (1.0 - (i / 300.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 24; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9998; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i]; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + SF2Sample sample = newSimpleDrumSample(sf2, "Snare Drum", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Snare Drum"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_bass_drum(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 1.8 * 5 + 1, 2, 1); + complexGaussianDist(data, 1.8 * 9 + 1, 2, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024; i < 2048; i++) + data[i] = 1.0 - (i - 1024) / 1024.0; + for (int i = 0; i < 512; i++) + data[i] = 10 * i / 512.0; + for (int i = 0; i < 10; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.999; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.5; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + SF2Sample sample = newSimpleDrumSample(sf2, "Bass Drum", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Bass Drum"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_tom(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 30, 0.5, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.8); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 200; i++) { + double g = (1.0 - (i / 200.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 30; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.5; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + normalize(datab, 0.99); + + SF2Sample sample = newSimpleDrumSample(sf2, "Tom", datab); + sample.setOriginalPitch(50); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Tom"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_closed_hihat(SF2Soundbank sf2) { + double datah[]; + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 2048; i++) + data[i] = 0.2 + 0.8 * (i / 2048.0); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datah = data; + } + + for (int i = 0; i < 5; i++) + datah[i] *= i / 5.0; + SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Closed Hi-Hat"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_open_hihat(SF2Soundbank sf2) { + double datah[]; + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 200; i++) + data[i] = 0; + for (int i = 0; i < 2048 * 4; i++) { + double gain = (i / (2048.0 * 4.0)); + data[i] = gain; + } + datah = data; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Open Hi-Hat"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) { + double datah[]; + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 100; i++) + data[i] = 0; + for (int i = 0; i < 512 * 2; i++) { + double gain = (i / (512.0 * 2.0)); + data[i] = gain; + } + datah = data; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Crash Cymbal"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_side_stick(SF2Soundbank sf2) { + double datab[]; + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 200; i++) { + double g = (1.0 - (i / 200.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 30; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datab = data; + } + + for (int i = 0; i < 10; i++) + datab[i] *= i / 10.0; + + SF2Sample sample = newSimpleDrumSample(sf2, "Side Stick", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Side Stick"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -50); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + + } + + public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name, + double[] data, double base) { + return newSimpleFFTSample(sf2, name, data, base, 10); + } + + public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name, + double[] data, double base, int fadeuptime) { + + int fftsize = data.length / 2; + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + double basefreq = (base / fftsize) * format.getSampleRate() * 0.5; + + randomPhase(data); + ifft(data); + data = realPart(data); + normalize(data, 0.9); + float[] fdata = toFloat(data); + fdata = loopExtend(fdata, fdata.length + 512); + fadeUp(fdata, fadeuptime); + byte[] bdata = toBytes(fdata, format); + + /* + * Create SoundFont2 sample. + */ + SF2Sample sample = new SF2Sample(sf2); + sample.setName(name); + sample.setData(bdata); + sample.setStartLoop(256); + sample.setEndLoop(fftsize + 256); + sample.setSampleRate((long) format.getSampleRate()); + double orgnote = (69 + 12) + + (12 * Math.log(basefreq / 440.0) / Math.log(2)); + sample.setOriginalPitch((int) orgnote); + sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0)); + sf2.addResource(sample); + + return sample; + } + + public static SF2Sample newSimpleFFTSample_dist(SF2Soundbank sf2, + String name, double[] data, double base, double preamp) { + + int fftsize = data.length / 2; + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + double basefreq = (base / fftsize) * format.getSampleRate() * 0.5; + + randomPhase(data); + ifft(data); + data = realPart(data); + + for (int i = 0; i < data.length; i++) { + data[i] = (1 - Math.exp(-Math.abs(data[i] * preamp))) + * Math.signum(data[i]); + } + + normalize(data, 0.9); + float[] fdata = toFloat(data); + fdata = loopExtend(fdata, fdata.length + 512); + fadeUp(fdata, 80); + byte[] bdata = toBytes(fdata, format); + + /* + * Create SoundFont2 sample. + */ + SF2Sample sample = new SF2Sample(sf2); + sample.setName(name); + sample.setData(bdata); + sample.setStartLoop(256); + sample.setEndLoop(fftsize + 256); + sample.setSampleRate((long) format.getSampleRate()); + double orgnote = (69 + 12) + + (12 * Math.log(basefreq / 440.0) / Math.log(2)); + sample.setOriginalPitch((int) orgnote); + sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0)); + sf2.addResource(sample); + + return sample; + } + + public static SF2Sample newSimpleDrumSample(SF2Soundbank sf2, String name, + double[] data) { + + int fftsize = data.length; + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + byte[] bdata = toBytes(toFloat(realPart(data)), format); + + /* + * Create SoundFont2 sample. + */ + SF2Sample sample = new SF2Sample(sf2); + sample.setName(name); + sample.setData(bdata); + sample.setStartLoop(256); + sample.setEndLoop(fftsize + 256); + sample.setSampleRate((long) format.getSampleRate()); + sample.setOriginalPitch(60); + sf2.addResource(sample); + + return sample; + } + + public static SF2Layer newLayer(SF2Soundbank sf2, String name, SF2Sample sample) { + SF2LayerRegion region = new SF2LayerRegion(); + region.setSample(sample); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName(name); + layer.getRegions().add(region); + sf2.addResource(layer); + + return layer; + } + + public static SF2Instrument newInstrument(SF2Soundbank sf2, String name, + Patch patch, SF2Layer... layers) { + + /* + * Create SoundFont2 instrument. + */ + SF2Instrument ins = new SF2Instrument(sf2); + ins.setPatch(patch); + ins.setName(name); + sf2.addInstrument(ins); + + /* + * Create region for instrument. + */ + for (int i = 0; i < layers.length; i++) { + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layers[i]); + ins.getRegions().add(insregion); + } + + return ins; + } + + static public void ifft(double[] data) { + new FFT(data.length / 2, 1).transform(data); + } + + static public void fft(double[] data) { + new FFT(data.length / 2, -1).transform(data); + } + + public static void complexGaussianDist(double[] cdata, double m, + double s, double v) { + for (int x = 0; x < cdata.length / 4; x++) { + cdata[x * 2] += v * (1.0 / (s * Math.sqrt(2 * Math.PI)) + * Math.exp((-1.0 / 2.0) * Math.pow((x - m) / s, 2.0))); + } + } + + static public void randomPhase(double[] data) { + for (int i = 0; i < data.length; i += 2) { + double phase = Math.random() * 2 * Math.PI; + double d = data[i]; + data[i] = Math.sin(phase) * d; + data[i + 1] = Math.cos(phase) * d; + } + } + + static public void randomPhase(double[] data, Random random) { + for (int i = 0; i < data.length; i += 2) { + double phase = random.nextDouble() * 2 * Math.PI; + double d = data[i]; + data[i] = Math.sin(phase) * d; + data[i + 1] = Math.cos(phase) * d; + } + } + + static public void normalize(double[] data, double target) { + double maxvalue = 0; + for (int i = 0; i < data.length; i++) { + if (data[i] > maxvalue) + maxvalue = data[i]; + if (-data[i] > maxvalue) + maxvalue = -data[i]; + } + if (maxvalue == 0) + return; + double gain = target / maxvalue; + for (int i = 0; i < data.length; i++) + data[i] *= gain; + } + + static public void normalize(float[] data, double target) { + double maxvalue = 0.5; + for (int i = 0; i < data.length; i++) { + if (data[i * 2] > maxvalue) + maxvalue = data[i * 2]; + if (-data[i * 2] > maxvalue) + maxvalue = -data[i * 2]; + } + double gain = target / maxvalue; + for (int i = 0; i < data.length; i++) + data[i * 2] *= gain; + } + + static public double[] realPart(double[] in) { + double[] out = new double[in.length / 2]; + for (int i = 0; i < out.length; i++) { + out[i] = in[i * 2]; + } + return out; + } + + static public double[] imgPart(double[] in) { + double[] out = new double[in.length / 2]; + for (int i = 0; i < out.length; i++) { + out[i] = in[i * 2]; + } + return out; + } + + static public float[] toFloat(double[] in) { + float[] out = new float[in.length]; + for (int i = 0; i < out.length; i++) { + out[i] = (float) in[i]; + } + return out; + } + + static public byte[] toBytes(float[] in, AudioFormat format) { + byte[] out = new byte[in.length * format.getFrameSize()]; + return AudioFloatConverter.getConverter(format).toByteArray(in, out); + } + + static public void fadeUp(double[] data, int samples) { + double dsamples = samples; + for (int i = 0; i < samples; i++) + data[i] *= i / dsamples; + } + + static public void fadeUp(float[] data, int samples) { + double dsamples = samples; + for (int i = 0; i < samples; i++) + data[i] *= i / dsamples; + } + + static public double[] loopExtend(double[] data, int newsize) { + double[] outdata = new double[newsize]; + int p_len = data.length; + int p_ps = 0; + for (int i = 0; i < outdata.length; i++) { + outdata[i] = data[p_ps]; + p_ps++; + if (p_ps == p_len) + p_ps = 0; + } + return outdata; + } + + static public float[] loopExtend(float[] data, int newsize) { + float[] outdata = new float[newsize]; + int p_len = data.length; + int p_ps = 0; + for (int i = 0; i < outdata.length; i++) { + outdata[i] = data[p_ps]; + p_ps++; + if (p_ps == p_len) + p_ps = 0; + } + return outdata; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/FFT.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/FFT.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,748 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Fast Fourier Transformer. + * + * @author Karl Helgason + */ +public final class FFT { + + private double[] w; + private int fftFrameSize; + private int sign; + private int[] bitm_array; + private int fftFrameSize2; + + // Sign = -1 is FFT, 1 is IFFT (inverse FFT) + // Data = Interlaced double array to be transformed. + // The order is: real (sin), complex (cos) + // Framesize must be power of 2 + public FFT(int fftFrameSize, int sign) { + w = computeTwiddleFactors(fftFrameSize, sign); + + this.fftFrameSize = fftFrameSize; + this.sign = sign; + fftFrameSize2 = fftFrameSize << 1; + + // Pre-process Bit-Reversal + bitm_array = new int[fftFrameSize2]; + for (int i = 2; i < fftFrameSize2; i += 2) { + int j; + int bitm; + for (bitm = 2, j = 0; bitm < fftFrameSize2; bitm <<= 1) { + if ((i & bitm) != 0) + j++; + j <<= 1; + } + bitm_array[i] = j; + } + + } + + public void transform(double[] data) { + bitreversal(data); + calc(fftFrameSize, data, sign, w); + } + + private final static double[] computeTwiddleFactors(int fftFrameSize, + int sign) { + + int imax = (int) (Math.log(fftFrameSize) / Math.log(2.)); + + double[] warray = new double[(fftFrameSize - 1) * 4]; + int w_index = 0; + + for (int i = 0, nstep = 2; i < imax; i++) { + int jmax = nstep; + nstep <<= 1; + + double wr = 1.0; + double wi = 0.0; + + double arg = Math.PI / (jmax >> 1); + double wfr = Math.cos(arg); + double wfi = sign * Math.sin(arg); + + for (int j = 0; j < jmax; j += 2) { + warray[w_index++] = wr; + warray[w_index++] = wi; + + double tempr = wr; + wr = tempr * wfr - wi * wfi; + wi = tempr * wfi + wi * wfr; + } + } + + // PRECOMPUTATION of wwr1, wwi1 for factor 4 Decomposition (3 * complex + // operators and 8 +/- complex operators) + { + w_index = 0; + int w_index2 = warray.length >> 1; + for (int i = 0, nstep = 2; i < (imax - 1); i++) { + int jmax = nstep; + nstep *= 2; + + int ii = w_index + jmax; + for (int j = 0; j < jmax; j += 2) { + double wr = warray[w_index++]; + double wi = warray[w_index++]; + double wr1 = warray[ii++]; + double wi1 = warray[ii++]; + warray[w_index2++] = wr * wr1 - wi * wi1; + warray[w_index2++] = wr * wi1 + wi * wr1; + } + } + + } + + return warray; + } + + private final static void calc(int fftFrameSize, double[] data, int sign, + double[] w) { + + final int fftFrameSize2 = fftFrameSize << 1; + + int nstep = 2; + + if (nstep >= fftFrameSize2) + return; + int i = nstep - 2; + if (sign == -1) + calcF4F(fftFrameSize, data, i, nstep, w); + else + calcF4I(fftFrameSize, data, i, nstep, w); + + } + + private final static void calcF2E(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + int jmax = nstep; + for (int n = 0; n < jmax; n += 2) { + double wr = w[i++]; + double wi = w[i++]; + int m = n + jmax; + double datam_r = data[m]; + double datam_i = data[m + 1]; + double datan_r = data[n]; + double datan_i = data[n + 1]; + double tempr = datam_r * wr - datam_i * wi; + double tempi = datam_r * wi + datam_i * wr; + data[m] = datan_r - tempr; + data[m + 1] = datan_i - tempi; + data[n] = datan_r + tempr; + data[n + 1] = datan_i + tempi; + } + return; + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4F(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + if (nstep << 2 == fftFrameSize2) { + // Goto Factor-4 Final Decomposition + // calcF4E(data, i, nstep, -1, w); + calcF4FE(fftFrameSize, data, i, nstep, w); + return; + } + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + + { + i += 2; + ii += 2; + iii += 2; + + for (int n = 0; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r; + double tempi = datam1_i; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r; + double n2w1i = datan2_i; + double m2ww1r = datam2_r; + double m2ww1i = datam2_i; + + tempr = m2ww1r - n2w1r; + tempi = m2ww1i - n2w1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + } + + for (int j = 2; j < jmax; j += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + for (int n = j; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = m2ww1r - n2w1r; + tempi = m2ww1i - n2w1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + } + } + + i += jmax << 1; + + } + + calcF2E(fftFrameSize, data, i, nstep, w); + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4I(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + if (nstep << 2 == fftFrameSize2) { + // Goto Factor-4 Final Decomposition + // calcF4E(data, i, nstep, 1, w); + calcF4IE(fftFrameSize, data, i, nstep, w); + return; + } + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + { + i += 2; + ii += 2; + iii += 2; + + for (int n = 0; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r; + double tempi = datam1_i; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r; + double n2w1i = datan2_i; + double m2ww1r = datam2_r; + double m2ww1i = datam2_i; + + tempr = n2w1r - m2ww1r; + tempi = n2w1i - m2ww1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + + } + for (int j = 2; j < jmax; j += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + for (int n = j; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = n2w1r - m2ww1r; + tempi = n2w1i - m2ww1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + } + + i += jmax << 1; + + } + + calcF2E(fftFrameSize, data, i, nstep, w); + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4FE(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + for (int n = 0; n < jmax; n += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = m2ww1r - n2w1r; + tempi = m2ww1i - n2w1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + + i += jmax << 1; + + } + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4IE(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + for (int n = 0; n < jmax; n += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = n2w1r - m2ww1r; + tempi = n2w1i - m2ww1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + + i += jmax << 1; + + } + + } + + private final void bitreversal(double[] data) { + if (fftFrameSize < 4) + return; + + int inverse = fftFrameSize2 - 2; + for (int i = 0; i < fftFrameSize; i += 4) { + int j = bitm_array[i]; + + // Performing Bit-Reversal, even v.s. even, O(2N) + if (i < j) { + + int n = i; + int m = j; + + // COMPLEX: SWAP(data[n], data[m]) + // Real Part + double tempr = data[n]; + data[n] = data[m]; + data[m] = tempr; + // Imagery Part + n++; + m++; + double tempi = data[n]; + data[n] = data[m]; + data[m] = tempi; + + n = inverse - i; + m = inverse - j; + + // COMPLEX: SWAP(data[n], data[m]) + // Real Part + tempr = data[n]; + data[n] = data[m]; + data[m] = tempr; + // Imagery Part + n++; + m++; + tempi = data[n]; + data[n] = data[m]; + data[m] = tempi; + } + + // Performing Bit-Reversal, odd v.s. even, O(N) + + int m = j + fftFrameSize; // bitm_array[i+2]; + // COMPLEX: SWAP(data[n], data[m]) + // Real Part + int n = i + 2; + double tempr = data[n]; + data[n] = data[m]; + data[m] = tempr; + // Imagery Part + n++; + m++; + double tempi = data[n]; + data[n] = data[m]; + data[m] = tempi; + } + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/InvalidDataException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/InvalidDataException.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; + +/** + * This exception is used when a file contains illegal or unexpected data. + * + * @author Karl Helgason + */ +public class InvalidDataException extends IOException { + + private static final long serialVersionUID = 1L; + + public InvalidDataException() { + super("Invalid Data!"); + } + + public InvalidDataException(String s) { + super(s); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/InvalidFormatException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/InvalidFormatException.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This exception is used when a reader is used to read file of a format + * it doesn't unterstand or support. + * + * @author Karl Helgason + */ +public class InvalidFormatException extends InvalidDataException { + + private static final long serialVersionUID = 1L; + + public InvalidFormatException() { + super("Invalid format!"); + } + + public InvalidFormatException(String s) { + super(s); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/JARSoundbankReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/JARSoundbankReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,120 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; + +/** + * JarSoundbankReader is used to read sounbank object from jar files. + * + * @author Karl Helgason + */ +public class JARSoundbankReader extends SoundbankReader { + + public boolean isZIP(URL url) { + boolean ok = false; + try { + InputStream stream = url.openStream(); + try { + byte[] buff = new byte[4]; + ok = stream.read(buff) == 4; + if (ok) { + ok = (buff[0] == 0x50 + && buff[1] == 0x4b + && buff[2] == 0x03 + && buff[3] == 0x04); + } + } finally { + stream.close(); + } + } catch (IOException e) { + } + return ok; + } + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + if (!isZIP(url)) + return null; + ArrayList soundbanks = new ArrayList(); + URLClassLoader ucl = URLClassLoader.newInstance(new URL[]{url}); + InputStream stream = ucl.getResourceAsStream( + "META-INF/services/javax.sound.midi.Soundbank"); + if (stream == null) + return null; + try + { + BufferedReader r = new BufferedReader(new InputStreamReader(stream)); + String line = r.readLine(); + while (line != null) { + if (!line.startsWith("#")) { + try { + Class c = Class.forName(line.trim(), true, ucl); + Object o = c.newInstance(); + if (o instanceof Soundbank) { + soundbanks.add((Soundbank) o); + } + } catch (ClassNotFoundException e) { + } catch (InstantiationException e) { + } catch (IllegalAccessException e) { + } + } + line = r.readLine(); + } + } + finally + { + stream.close(); + } + if (soundbanks.size() == 0) + return null; + if (soundbanks.size() == 1) + return soundbanks.get(0); + SimpleSoundbank sbk = new SimpleSoundbank(); + for (Soundbank soundbank : soundbanks) + sbk.addAllInstruments(soundbank); + return sbk; + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + return null; + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + return getSoundbank(file.toURI().toURL()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,126 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * ModelAbstractChannelMixer is ready for use class to implement + * ModelChannelMixer interface. + * + * @author Karl Helgason + */ +public abstract class ModelAbstractChannelMixer implements ModelChannelMixer { + + public abstract boolean process(float[][] buffer, int offset, int len); + + public abstract void stop(); + + public void allNotesOff() { + } + + public void allSoundOff() { + } + + public void controlChange(int controller, int value) { + } + + public int getChannelPressure() { + return 0; + } + + public int getController(int controller) { + return 0; + } + + public boolean getMono() { + return false; + } + + public boolean getMute() { + return false; + } + + public boolean getOmni() { + return false; + } + + public int getPitchBend() { + return 0; + } + + public int getPolyPressure(int noteNumber) { + return 0; + } + + public int getProgram() { + return 0; + } + + public boolean getSolo() { + return false; + } + + public boolean localControl(boolean on) { + return false; + } + + public void noteOff(int noteNumber) { + } + + public void noteOff(int noteNumber, int velocity) { + } + + public void noteOn(int noteNumber, int velocity) { + } + + public void programChange(int program) { + } + + public void programChange(int bank, int program) { + } + + public void resetAllControllers() { + } + + public void setChannelPressure(int pressure) { + } + + public void setMono(boolean on) { + } + + public void setMute(boolean mute) { + } + + public void setOmni(boolean on) { + } + + public void setPitchBend(int bend) { + } + + public void setPolyPressure(int noteNumber, int pressure) { + } + + public void setSolo(boolean soloState) { + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelAbstractOscillator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelAbstractOscillator.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,200 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.midi.VoiceStatus; + +/** + * A abstract class used to simplify creating custom ModelOscillator. + * + * @author Karl Helgason + */ +public abstract class ModelAbstractOscillator + implements ModelOscillator, ModelOscillatorStream, Soundbank { + + protected float pitch = 6000; + protected float samplerate; + protected MidiChannel channel; + protected VoiceStatus voice; + protected int noteNumber; + protected int velocity; + protected boolean on = false; + + public void init() { + } + + public void close() throws IOException { + } + + public void noteOff(int velocity) { + on = false; + } + + public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, + int velocity) { + this.channel = channel; + this.voice = voice; + this.noteNumber = noteNumber; + this.velocity = velocity; + on = true; + } + + public int read(float[][] buffer, int offset, int len) throws IOException { + return -1; + } + + public MidiChannel getChannel() { + return channel; + } + + public VoiceStatus getVoice() { + return voice; + } + + public int getNoteNumber() { + return noteNumber; + } + + public int getVelocity() { + return velocity; + } + + public boolean isOn() { + return on; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + public float getPitch() { + return pitch; + } + + public void setSampleRate(float samplerate) { + this.samplerate = samplerate; + } + + public float getSampleRate() { + return samplerate; + } + + public float getAttenuation() { + return 0; + } + + public int getChannels() { + return 1; + } + + public String getName() { + return getClass().getName(); + } + + public Patch getPatch() { + return new Patch(0, 0); + } + + public ModelOscillatorStream open(float samplerate) { + ModelAbstractOscillator oscs; + try { + oscs = this.getClass().newInstance(); + } catch (InstantiationException e) { + throw new IllegalArgumentException(e); + } catch (IllegalAccessException e) { + throw new IllegalArgumentException(e); + } + oscs.setSampleRate(samplerate); + oscs.init(); + return oscs; + } + + public ModelPerformer getPerformer() { + // Create performer for my custom oscillirator + ModelPerformer performer = new ModelPerformer(); + performer.getOscillators().add(this); + return performer; + + } + + public ModelInstrument getInstrument() { + // Create Instrument object around my performer + SimpleInstrument ins = new SimpleInstrument(); + ins.setName(getName()); + ins.add(getPerformer()); + ins.setPatch(getPatch()); + return ins; + + } + + public Soundbank getSoundBank() { + // Create Soundbank object around the instrument + SimpleSoundbank sbk = new SimpleSoundbank(); + sbk.addInstrument(getInstrument()); + return sbk; + } + + public String getDescription() { + return getName(); + } + + public Instrument getInstrument(Patch patch) { + Instrument ins = getInstrument(); + Patch p = ins.getPatch(); + if (p.getBank() != patch.getBank()) + return null; + if (p.getProgram() != patch.getProgram()) + return null; + if (p instanceof ModelPatch && patch instanceof ModelPatch) { + if (((ModelPatch)p).isPercussion() + != ((ModelPatch)patch).isPercussion()) { + return null; + } + } + return ins; + } + + public Instrument[] getInstruments() { + return new Instrument[]{getInstrument()}; + } + + public SoundbankResource[] getResources() { + return new SoundbankResource[0]; + } + + public String getVendor() { + return null; + } + + public String getVersion() { + return null; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelByteBuffer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelByteBuffer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,329 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.util.Collection; + +/** + * This class is a pointer to a binary array either in memory or on disk. + * + * @author Karl Helgason + */ +public class ModelByteBuffer { + + private ModelByteBuffer root = this; + private File file; + private long fileoffset; + private byte[] buffer; + private long offset; + private final long len; + + private class RandomFileInputStream extends InputStream { + + private RandomAccessFile raf; + private long left; + private long mark = 0; + private long markleft = 0; + + public RandomFileInputStream() throws IOException { + raf = new RandomAccessFile(root.file, "r"); + raf.seek(root.fileoffset + arrayOffset()); + left = capacity(); + } + + public int available() throws IOException { + if (left > Integer.MAX_VALUE) + return Integer.MAX_VALUE; + return (int)left; + } + + public synchronized void mark(int readlimit) { + try { + mark = raf.getFilePointer(); + markleft = left; + } catch (IOException e) { + //e.printStackTrace(); + } + } + + public boolean markSupported() { + return true; + } + + public synchronized void reset() throws IOException { + raf.seek(mark); + left = markleft; + } + + public long skip(long n) throws IOException { + if( n < 0) + return 0; + if (n > left) + n = left; + long p = raf.getFilePointer(); + raf.seek(p + n); + left -= n; + return n; + } + + public int read(byte b[], int off, int len) throws IOException { + if (len > left) + len = (int)left; + if (left == 0) + return -1; + len = raf.read(b, off, len); + if (len == -1) + return -1; + left -= len; + return len; + } + + public int read(byte[] b) throws IOException { + int len = b.length; + if (len > left) + len = (int)left; + if (left == 0) + return -1; + len = raf.read(b, 0, len); + if (len == -1) + return -1; + left -= len; + return len; + } + + public int read() throws IOException { + if (left == 0) + return -1; + int b = raf.read(); + if (b == -1) + return -1; + left--; + return b; + } + + public void close() throws IOException { + raf.close(); + } + } + + private ModelByteBuffer(ModelByteBuffer parent, + long beginIndex, long endIndex, boolean independent) { + this.root = parent.root; + this.offset = 0; + long parent_len = parent.len; + if (beginIndex < 0) + beginIndex = 0; + if (beginIndex > parent_len) + beginIndex = parent_len; + if (endIndex < 0) + endIndex = 0; + if (endIndex > parent_len) + endIndex = parent_len; + if (beginIndex > endIndex) + beginIndex = endIndex; + offset = beginIndex; + len = endIndex - beginIndex; + if (independent) { + buffer = root.buffer; + if (root.file != null) { + file = root.file; + fileoffset = root.fileoffset + arrayOffset(); + offset = 0; + } else + offset = arrayOffset(); + root = this; + } + } + + public ModelByteBuffer(byte[] buffer) { + this.buffer = buffer; + this.offset = 0; + this.len = buffer.length; + } + + public ModelByteBuffer(byte[] buffer, int offset, int len) { + this.buffer = buffer; + this.offset = offset; + this.len = len; + } + + public ModelByteBuffer(File file) { + this.file = file; + this.fileoffset = 0; + this.len = file.length(); + } + + public ModelByteBuffer(File file, long offset, long len) { + this.file = file; + this.fileoffset = offset; + this.len = len; + } + + public void writeTo(OutputStream out) throws IOException { + if (root.file != null && root.buffer == null) { + InputStream is = getInputStream(); + byte[] buff = new byte[1024]; + int ret; + while ((ret = is.read(buff)) != -1) + out.write(buff, 0, ret); + } else + out.write(array(), (int) arrayOffset(), (int) capacity()); + } + + public InputStream getInputStream() { + if (root.file != null && root.buffer == null) { + try { + return new RandomFileInputStream(); + } catch (IOException e) { + //e.printStackTrace(); + return null; + } + } + return new ByteArrayInputStream(array(), + (int)arrayOffset(), (int)capacity()); + } + + public ModelByteBuffer subbuffer(long beginIndex) { + return subbuffer(beginIndex, capacity()); + } + + public ModelByteBuffer subbuffer(long beginIndex, long endIndex) { + return subbuffer(beginIndex, endIndex, false); + } + + public ModelByteBuffer subbuffer(long beginIndex, long endIndex, + boolean independent) { + return new ModelByteBuffer(this, beginIndex, endIndex, independent); + } + + public byte[] array() { + return root.buffer; + } + + public long arrayOffset() { + if (root != this) + return root.arrayOffset() + offset; + return offset; + } + + public long capacity() { + return len; + } + + public ModelByteBuffer getRoot() { + return root; + } + + public File getFile() { + return file; + } + + public long getFilePointer() { + return fileoffset; + } + + public static void loadAll(Collection col) + throws IOException { + File selfile = null; + RandomAccessFile raf = null; + try { + for (ModelByteBuffer mbuff : col) { + mbuff = mbuff.root; + if (mbuff.file == null) + continue; + if (mbuff.buffer != null) + continue; + if (selfile == null || !selfile.equals(mbuff.file)) { + if (raf != null) { + raf.close(); + raf = null; + } + selfile = mbuff.file; + raf = new RandomAccessFile(mbuff.file, "r"); + } + raf.seek(mbuff.fileoffset); + byte[] buffer = new byte[(int) mbuff.capacity()]; + + int read = 0; + int avail = buffer.length; + while (read != avail) { + if (avail - read > 65536) { + raf.readFully(buffer, read, 65536); + read += 65536; + } else { + raf.readFully(buffer, read, avail - read); + read = avail; + } + + } + + mbuff.buffer = buffer; + mbuff.offset = 0; + } + } finally { + if (raf != null) + raf.close(); + } + } + + public void load() throws IOException { + if (root != this) { + root.load(); + return; + } + if (buffer != null) + return; + if (file == null) { + throw new IllegalStateException( + "No file associated with this ByteBuffer!"); + } + + DataInputStream is = new DataInputStream(getInputStream()); + buffer = new byte[(int) capacity()]; + offset = 0; + is.readFully(buffer); + is.close(); + + } + + public void unload() { + if (root != this) { + root.unload(); + return; + } + if (file == null) { + throw new IllegalStateException( + "No file associated with this ByteBuffer!"); + } + root.buffer = null; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,281 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFormat.Encoding; + +/** + * Wavetable oscillator for pre-loaded data. + * + * @author Karl Helgason + */ +public class ModelByteBufferWavetable implements ModelWavetable { + + private class Buffer8PlusInputStream extends InputStream { + + private boolean bigendian; + private int framesize_pc; + int pos = 0; + int pos2 = 0; + int markpos = 0; + int markpos2 = 0; + + public Buffer8PlusInputStream() { + framesize_pc = format.getFrameSize() / format.getChannels(); + bigendian = format.isBigEndian(); + } + + public int read(byte[] b, int off, int len) throws IOException { + int avail = available(); + if (avail <= 0) + return -1; + if (len > avail) + len = avail; + byte[] buff1 = buffer.array(); + byte[] buff2 = buffer8.array(); + pos += buffer.arrayOffset(); + pos2 += buffer8.arrayOffset(); + if (bigendian) { + for (int i = 0; i < len; i += (framesize_pc + 1)) { + System.arraycopy(buff1, pos, b, i, framesize_pc); + System.arraycopy(buff2, pos2, b, i + framesize_pc, 1); + pos += framesize_pc; + pos2 += 1; + } + } else { + for (int i = 0; i < len; i += (framesize_pc + 1)) { + System.arraycopy(buff2, pos2, b, i, 1); + System.arraycopy(buff1, pos, b, i + 1, framesize_pc); + pos += framesize_pc; + pos2 += 1; + } + } + pos -= buffer.arrayOffset(); + pos2 -= buffer8.arrayOffset(); + return len; + } + + public long skip(long n) throws IOException { + int avail = available(); + if (avail <= 0) + return -1; + if (n > avail) + n = avail; + pos += (n / (framesize_pc + 1)) * (framesize_pc); + pos2 += n / (framesize_pc + 1); + return super.skip(n); + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b, 0, 1); + if (ret == -1) + return -1; + return 0 & 0xFF; + } + + public boolean markSupported() { + return true; + } + + public int available() throws IOException { + return (int)buffer.capacity() + (int)buffer8.capacity() - pos - pos2; + } + + public synchronized void mark(int readlimit) { + markpos = pos; + markpos2 = pos2; + } + + public synchronized void reset() throws IOException { + pos = markpos; + pos2 = markpos2; + + } + } + + private float loopStart = -1; + private float loopLength = -1; + private ModelByteBuffer buffer; + private ModelByteBuffer buffer8 = null; + private AudioFormat format = null; + private float pitchcorrection = 0; + private float attenuation = 0; + private int loopType = LOOP_TYPE_OFF; + + public ModelByteBufferWavetable(ModelByteBuffer buffer) { + this.buffer = buffer; + } + + public ModelByteBufferWavetable(ModelByteBuffer buffer, + float pitchcorrection) { + this.buffer = buffer; + this.pitchcorrection = pitchcorrection; + } + + public ModelByteBufferWavetable(ModelByteBuffer buffer, AudioFormat format) { + this.format = format; + this.buffer = buffer; + } + + public ModelByteBufferWavetable(ModelByteBuffer buffer, AudioFormat format, + float pitchcorrection) { + this.format = format; + this.buffer = buffer; + this.pitchcorrection = pitchcorrection; + } + + public void set8BitExtensionBuffer(ModelByteBuffer buffer) { + buffer8 = buffer; + } + + public ModelByteBuffer get8BitExtensionBuffer() { + return buffer8; + } + + public ModelByteBuffer getBuffer() { + return buffer; + } + + public AudioFormat getFormat() { + if (format == null) { + if (buffer == null) + return null; + InputStream is = buffer.getInputStream(); + AudioFormat format = null; + try { + format = AudioSystem.getAudioFileFormat(is).getFormat(); + } catch (Exception e) { + //e.printStackTrace(); + } + try { + is.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + return format; + } + return format; + } + + public AudioFloatInputStream openStream() { + if (buffer == null) + return null; + if (format == null) { + InputStream is = buffer.getInputStream(); + AudioInputStream ais = null; + try { + ais = AudioSystem.getAudioInputStream(is); + } catch (Exception e) { + //e.printStackTrace(); + return null; + } + return AudioFloatInputStream.getInputStream(ais); + } + if (buffer.array() == null) { + return AudioFloatInputStream.getInputStream(new AudioInputStream( + buffer.getInputStream(), format, buffer.capacity())); + } + if (buffer8 != null) { + if (format.getEncoding().equals(Encoding.PCM_SIGNED) + || format.getEncoding().equals(Encoding.PCM_UNSIGNED)) { + InputStream is = new Buffer8PlusInputStream(); + AudioFormat format2 = new AudioFormat( + format.getEncoding(), + format.getSampleRate(), + format.getSampleSizeInBits() + 8, + format.getChannels(), + format.getFrameSize() + (1 * format.getChannels()), + format.getFrameRate(), + format.isBigEndian()); + + AudioInputStream ais = new AudioInputStream(is, format2, + buffer.capacity() / format.getFrameSize()); + return AudioFloatInputStream.getInputStream(ais); + } + } + return AudioFloatInputStream.getInputStream(format, buffer.array(), + (int)buffer.arrayOffset(), (int)buffer.capacity()); + } + + public int getChannels() { + return getFormat().getChannels(); + } + + public ModelOscillatorStream open(float samplerate) { + // ModelWavetableOscillator doesn't support ModelOscillatorStream + return null; + } + + // attenuation is in cB + public float getAttenuation() { + return attenuation; + } + // attenuation is in cB + public void setAttenuation(float attenuation) { + this.attenuation = attenuation; + } + + public float getLoopLength() { + return loopLength; + } + + public void setLoopLength(float loopLength) { + this.loopLength = loopLength; + } + + public float getLoopStart() { + return loopStart; + } + + public void setLoopStart(float loopStart) { + this.loopStart = loopStart; + } + + public void setLoopType(int loopType) { + this.loopType = loopType; + } + + public int getLoopType() { + return loopType; + } + + public float getPitchcorrection() { + return pitchcorrection; + } + + public void setPitchcorrection(float pitchcorrection) { + this.pitchcorrection = pitchcorrection; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelChannelMixer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelChannelMixer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiChannel; + +/** + * ModelChannelMixer is used to process channel voice mix output before going + * to master output.
+ * It can be used to:
+ *

    + *
  • Implement non-voice oriented instruments.
  • + *
  • Add insert effect to instruments; for example distortion effect.
  • + * + *

    + * Warning! Classes that implements ModelChannelMixer must be thread-safe. + * + * @author Karl Helgason + */ +public interface ModelChannelMixer extends MidiChannel { + + // Used to process input audio from voices mix. + public boolean process(float[][] buffer, int offset, int len); + + // Is used to trigger that this mixer is not be used + // and it should fade out. + public void stop(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelConnectionBlock.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelConnectionBlock.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,135 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Connection blocks are used to connect source variable + * to a destination variable. + * For example Note On velocity can be connected to output gain. + * In DLS this is called articulator and in SoundFonts (SF2) a modulator. + * + * @author Karl Helgason + */ +public class ModelConnectionBlock { + + // + // source1 * source2 * scale -> destination + // + private final static ModelSource[] no_sources = new ModelSource[0]; + private ModelSource[] sources = no_sources; + private double scale = 1; + private ModelDestination destination; + + public ModelConnectionBlock() { + } + + public ModelConnectionBlock(double scale, ModelDestination destination) { + this.scale = scale; + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, + ModelDestination destination) { + if (source != null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, double scale, + ModelDestination destination) { + if (source != null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } + this.scale = scale; + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, ModelSource control, + ModelDestination destination) { + if (source != null) { + if (control == null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } else { + this.sources = new ModelSource[2]; + this.sources[0] = source; + this.sources[1] = control; + } + } + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, ModelSource control, + double scale, ModelDestination destination) { + if (source != null) { + if (control == null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } else { + this.sources = new ModelSource[2]; + this.sources[0] = source; + this.sources[1] = control; + } + } + this.scale = scale; + this.destination = destination; + } + + public ModelDestination getDestination() { + return destination; + } + + public void setDestination(ModelDestination destination) { + this.destination = destination; + } + + public double getScale() { + return scale; + } + + public void setScale(double scale) { + this.scale = scale; + } + + public ModelSource[] getSources() { + return sources; + } + + public void setSources(ModelSource[] source) { + this.sources = source; + } + + public void addSource(ModelSource source) { + ModelSource[] oldsources = sources; + sources = new ModelSource[oldsources.length + 1]; + for (int i = 0; i < oldsources.length; i++) { + sources[i] = oldsources[i]; + } + sources[sources.length - 1] = source; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelDestination.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelDestination.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,117 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to identify destinations in connection blocks, + * see ModelConnectionBlock. + * + * @author Karl Helgason + */ +public class ModelDestination { + + public static final ModelIdentifier DESTINATION_NONE = null; + public static final ModelIdentifier DESTINATION_KEYNUMBER + = new ModelIdentifier("noteon", "keynumber"); + public static final ModelIdentifier DESTINATION_VELOCITY + = new ModelIdentifier("noteon", "velocity"); + public static final ModelIdentifier DESTINATION_PITCH + = new ModelIdentifier("osc", "pitch"); // cent + public static final ModelIdentifier DESTINATION_GAIN + = new ModelIdentifier("mixer", "gain"); // cB + public static final ModelIdentifier DESTINATION_PAN + = new ModelIdentifier("mixer", "pan"); // 0.1 % + public static final ModelIdentifier DESTINATION_REVERB + = new ModelIdentifier("mixer", "reverb"); // 0.1 % + public static final ModelIdentifier DESTINATION_CHORUS + = new ModelIdentifier("mixer", "chorus"); // 0.1 % + public static final ModelIdentifier DESTINATION_LFO1_DELAY + = new ModelIdentifier("lfo", "delay", 0); // timecent + public static final ModelIdentifier DESTINATION_LFO1_FREQ + = new ModelIdentifier("lfo", "freq", 0); // cent + public static final ModelIdentifier DESTINATION_LFO2_DELAY + = new ModelIdentifier("lfo", "delay", 1); // timecent + public static final ModelIdentifier DESTINATION_LFO2_FREQ + = new ModelIdentifier("lfo", "freq", 1); // cent + public static final ModelIdentifier DESTINATION_EG1_DELAY + = new ModelIdentifier("eg", "delay", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_ATTACK + = new ModelIdentifier("eg", "attack", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_HOLD + = new ModelIdentifier("eg", "hold", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_DECAY + = new ModelIdentifier("eg", "decay", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_SUSTAIN + = new ModelIdentifier("eg", "sustain", 0); + // 0.1 % (I want this to be value not %) + public static final ModelIdentifier DESTINATION_EG1_RELEASE + = new ModelIdentifier("eg", "release", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_SHUTDOWN + = new ModelIdentifier("eg", "shutdown", 0); // timecent + public static final ModelIdentifier DESTINATION_EG2_DELAY + = new ModelIdentifier("eg", "delay", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_ATTACK + = new ModelIdentifier("eg", "attack", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_HOLD + = new ModelIdentifier("eg", "hold", 1); // 0.1 % + public static final ModelIdentifier DESTINATION_EG2_DECAY + = new ModelIdentifier("eg", "decay", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_SUSTAIN + = new ModelIdentifier("eg", "sustain", 1); + // 0.1 % ( I want this to be value not %) + public static final ModelIdentifier DESTINATION_EG2_RELEASE + = new ModelIdentifier("eg", "release", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_SHUTDOWN + = new ModelIdentifier("eg", "shutdown", 1); // timecent + public static final ModelIdentifier DESTINATION_FILTER_FREQ + = new ModelIdentifier("filter", "freq", 0); // cent + public static final ModelIdentifier DESTINATION_FILTER_Q + = new ModelIdentifier("filter", "q", 0); // cB + private ModelIdentifier destination = DESTINATION_NONE; + private ModelTransform transform = new ModelStandardTransform(); + + public ModelDestination() { + } + + public ModelDestination(ModelIdentifier id) { + destination = id; + } + + public ModelIdentifier getIdentifier() { + return destination; + } + + public void setIdentifier(ModelIdentifier destination) { + this.destination = destination; + } + + public ModelTransform getTransform() { + return transform; + } + + public void setTransform(ModelTransform transform) { + this.transform = transform; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelDirectedPlayer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelDirectedPlayer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,36 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * ModelDirectedPlayer is the one who is directed by ModelDirector + * to play ModelPerformer objects. + * + * @author Karl Helgason + */ +public interface ModelDirectedPlayer { + + public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelDirector.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelDirector.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A director chooses what performers should be played for each note on + * and note off events. + * + * ModelInstrument can implement custom performer who chooses what performers + * to play for example by sustain pedal is off or on. + * + * The default director (ModelStandardDirector) chooses performers + * by there keyfrom,keyto,velfrom,velto properties. + * + * @author Karl Helgason + */ +public interface ModelDirector { + + public void noteOn(int noteNumber, int velocity); + + public void noteOff(int noteNumber, int velocity); + + public void close(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelIdentifier.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelIdentifier.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,169 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class stores the identity of source and destinations in connection + * blocks, see ModelConnectionBlock. + * + * @author Karl Helgason + */ +public class ModelIdentifier { + + /* + * Object Variable + * ------ -------- + * + * // INPUT parameters + * noteon keynumber 7 bit midi value + * velocity 7 bit midi vale + * on 1 or 0 + * + * midi pitch 14 bit midi value + * channel_pressure 7 bit midi value + * poly_pressure 7 bit midi value + * + * midi_cc 0 (midi control #0 7 bit midi value + * 1 (midi control #1 7 bit midi value + * ... + * 127 (midi control #127 7 bit midi value + * + * midi_rpn 0 (midi rpn control #0) 14 bit midi value + * 1 (midi rpn control #1) 14 bit midi value + * .... + * + * // DAHDSR envelope generator + * eg (null) + * delay timecent + * attack timecent + * hold timecent + * decay timecent + * sustain 0.1 % + * release timecent + * + * // Low frequency oscillirator (sine wave) + * lfo (null) + * delay timcent + * freq cent + * + * // Resonance LowPass Filter 6dB slope + * filter (null) (output/input) + * freq cent + * q cB + * + * // The oscillator with preloaded wavetable data + * osc (null) + * pitch cent + * + * // Output mixer pins + * mixer gain cB + * pan 0.1 % + * reverb 0.1 % + * chorus 0.1 % + * + */ + private String object = null; + private String variable = null; + private int instance = 0; + + public ModelIdentifier(String object) { + this.object = object; + } + + public ModelIdentifier(String object, int instance) { + this.object = object; + this.instance = instance; + } + + public ModelIdentifier(String object, String variable) { + this.object = object; + this.variable = variable; + + } + + public ModelIdentifier(String object, String variable, int instance) { + this.object = object; + this.variable = variable; + this.instance = instance; + + } + + public int getInstance() { + return instance; + } + + public void setInstance(int instance) { + this.instance = instance; + } + + public String getObject() { + return object; + } + + public void setObject(String object) { + this.object = object; + } + + public String getVariable() { + return variable; + } + + public void setVariable(String variable) { + this.variable = variable; + } + + public int hashCode() { + int hashcode = instance; + if(object != null) hashcode |= object.hashCode(); + if(variable != null) hashcode |= variable.hashCode(); + return hashcode; + } + + public boolean equals(Object obj) { + if (!(obj instanceof ModelIdentifier)) + return false; + + ModelIdentifier mobj = (ModelIdentifier)obj; + if ((object == null) != (mobj.object == null)) + return false; + if ((variable == null) != (mobj.variable == null)) + return false; + if (mobj.getInstance() != getInstance()) + return false; + if (!(object == null || object.equals(mobj.object))) + return false; + if (!(variable == null || variable.equals(mobj.variable))) + return false; + return true; + } + + public String toString() { + if (variable == null) { + return object + "[" + instance + "]"; + } else { + return object + "[" + instance + "]" + "." + variable; + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,136 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.AudioFormat; + +/** + * The model instrument class. + * + *

    The main methods to override are:
    + * getPerformer, getDirector, getChannelMixer. + * + *

    Performers are used to define what voices which will + * playback when using the instrument.
    + * + * ChannelMixer is used to add channel-wide processing + * on voices output or to define non-voice oriented instruments.
    + * + * Director is used to change how the synthesizer + * chooses what performers to play on midi events. + * + * @author Karl Helgason + */ +public abstract class ModelInstrument extends Instrument { + + protected ModelInstrument(Soundbank soundbank, Patch patch, String name, + Class dataClass) { + super(soundbank, patch, name, dataClass); + } + + public ModelDirector getDirector(ModelPerformer[] performers, + MidiChannel channel, ModelDirectedPlayer player) { + return new ModelStandardDirector(performers, player); + } + + public ModelPerformer[] getPerformers() { + return new ModelPerformer[0]; + } + + public ModelChannelMixer getChannelMixer(MidiChannel channel, + AudioFormat format) { + return null; + } + + // Get General MIDI 2 Alias patch for this instrument. + public Patch getPatchAlias() { + Patch patch = getPatch(); + int program = patch.getProgram(); + int bank = patch.getBank(); + if (bank != 0) + return patch; + boolean percussion = false; + if (getPatch() instanceof ModelPatch) + percussion = ((ModelPatch)getPatch()).isPercussion(); + if (percussion) + return new Patch(0x78 << 7, program); + else + return new Patch(0x79 << 7, program); + } + + // Return name of all the keys. + // This information is generated from ModelPerformer.getName() + // returned from getPerformers(). + public String[] getKeys() { + String[] keys = new String[128]; + for (ModelPerformer performer : getPerformers()) { + for (int k = performer.getKeyFrom(); k <= performer.getKeyTo(); k++) { + if (k >= 0 && k < 128 && keys[k] == null) { + String name = performer.getName(); + if (name == null) + name = "untitled"; + keys[k] = name; + } + } + } + return keys; + } + + // Return what channels this instrument will probably response + // on General MIDI synthesizer. + public boolean[] getChannels() { + boolean percussion = false; + if (getPatch() instanceof ModelPatch) + percussion = ((ModelPatch)getPatch()).isPercussion(); + + // Check if instrument is percussion. + if (percussion) { + boolean[] ch = new boolean[16]; + for (int i = 0; i < ch.length; i++) + ch[i] = false; + ch[9] = true; + return ch; + } + + // Check if instrument uses General MIDI 2 default banks. + int bank = getPatch().getBank(); + if (bank >> 7 == 0x78 || bank >> 7 == 0x79) { + boolean[] ch = new boolean[16]; + for (int i = 0; i < ch.length; i++) + ch[i] = true; + return ch; + } + + boolean[] ch = new boolean[16]; + for (int i = 0; i < ch.length; i++) + ch[i] = true; + ch[9] = false; + return ch; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelInstrumentComparator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelInstrumentComparator.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Comparator; +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; + +/** + * Instrument comparator class. + * Used to order instrument by program, bank, percussion. + * + * @author Karl Helgason + */ +public class ModelInstrumentComparator implements Comparator { + + public int compare(Instrument arg0, Instrument arg1) { + Patch p0 = arg0.getPatch(); + Patch p1 = arg1.getPatch(); + int a = p0.getBank() * 128 + p0.getProgram(); + int b = p1.getBank() * 128 + p1.getProgram(); + if (p0 instanceof ModelPatch) { + a += ((ModelPatch)p0).isPercussion() ? 2097152 : 0; + } + if (p1 instanceof ModelPatch) { + b += ((ModelPatch)p1).isPercussion() ? 2097152 : 0; + } + return a - b; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelMappedInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelMappedInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,62 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; +import javax.sound.sampled.AudioFormat; + +/** + * This class is used to map instrument to another patch. + * + * @author Karl Helgason + */ +public class ModelMappedInstrument extends ModelInstrument { + + private ModelInstrument ins; + + public ModelMappedInstrument(ModelInstrument ins, Patch patch) { + super(ins.getSoundbank(), patch, ins.getName(), ins.getDataClass()); + this.ins = ins; + } + + public Object getData() { + return ins.getData(); + } + + public ModelPerformer[] getPerformers() { + return ins.getPerformers(); + } + + public ModelDirector getDirector(ModelPerformer[] performers, + MidiChannel channel, ModelDirectedPlayer player) { + return ins.getDirector(performers, channel, player); + } + + public ModelChannelMixer getChannelMixer(MidiChannel channel, + AudioFormat format) { + return ins.getChannelMixer(channel, format); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelOscillator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelOscillator.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This interface is used for oscillators. + * See example in ModelDefaultOscillator which is a wavetable oscillator. + * + * @author Karl Helgason + */ +public interface ModelOscillator { + + public int getChannels(); + + /** + * Attenuation is in cB. + * @return + */ + public float getAttenuation(); + + public ModelOscillatorStream open(float samplerate); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelOscillatorStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelOscillatorStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.VoiceStatus; + +/** + * This interface is used for audio streams from ModelOscillator. + * + * @author Karl Helgason + */ +public interface ModelOscillatorStream { + + public void setPitch(float pitch); // Pitch is in cents! + + public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, + int velocity); + + public void noteOff(int velocity); + + public int read(float[][] buffer, int offset, int len) throws IOException; + + public void close() throws IOException; +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelPatch.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelPatch.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.Patch; + +/** + * A extended patch object that has isPercussion function. + * Which is necessary to identify percussion instruments + * from melodic instruments. + * + * @author Karl Helgason + */ +public class ModelPatch extends Patch { + + private boolean percussion = false; + + public ModelPatch(int bank, int program) { + super(bank, program); + } + + public ModelPatch(int bank, int program, boolean percussion) { + super(bank, program); + this.percussion = percussion; + } + + public boolean isPercussion() { + return percussion; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelPerformer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelPerformer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,143 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to define how to synthesize audio in universal maner + * for both SF2 and DLS instruments. + * + * @author Karl Helgason + */ +public class ModelPerformer { + + private List oscillators = new ArrayList(); + private List connectionBlocks + = new ArrayList(); + private int keyFrom = 0; + private int keyTo = 127; + private int velFrom = 0; + private int velTo = 127; + private int exclusiveClass = 0; + private boolean releaseTrigger = false; + private boolean selfNonExclusive = false; + private Object userObject = null; + private boolean addDefaultConnections = true; + private String name = null; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getConnectionBlocks() { + return connectionBlocks; + } + + public void setConnectionBlocks(List connectionBlocks) { + this.connectionBlocks = connectionBlocks; + } + + public List getOscillators() { + return oscillators; + } + + public int getExclusiveClass() { + return exclusiveClass; + } + + public void setExclusiveClass(int exclusiveClass) { + this.exclusiveClass = exclusiveClass; + } + + public boolean isSelfNonExclusive() { + return selfNonExclusive; + } + + public void setSelfNonExclusive(boolean selfNonExclusive) { + this.selfNonExclusive = selfNonExclusive; + } + + public int getKeyFrom() { + return keyFrom; + } + + public void setKeyFrom(int keyFrom) { + this.keyFrom = keyFrom; + } + + public int getKeyTo() { + return keyTo; + } + + public void setKeyTo(int keyTo) { + this.keyTo = keyTo; + } + + public int getVelFrom() { + return velFrom; + } + + public void setVelFrom(int velFrom) { + this.velFrom = velFrom; + } + + public int getVelTo() { + return velTo; + } + + public void setVelTo(int velTo) { + this.velTo = velTo; + } + + public boolean isReleaseTriggered() { + return releaseTrigger; + } + + public void setReleaseTriggered(boolean value) { + this.releaseTrigger = value; + } + + public Object getUserObject() { + return userObject; + } + + public void setUserObject(Object object) { + userObject = object; + } + + public boolean isDefaultConnectionsEnabled() { + return addDefaultConnections; + } + + public void setDefaultConnectionsEnabled(boolean addDefaultConnections) { + this.addDefaultConnections = addDefaultConnections; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelSource.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,109 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to identify sources in connection blocks, + * see ModelConnectionBlock. + * + * @author Karl Helgason + */ +public class ModelSource { + + public static final ModelIdentifier SOURCE_NONE = null; + public static final ModelIdentifier SOURCE_NOTEON_KEYNUMBER = + new ModelIdentifier("noteon", "keynumber"); // midi keynumber + public static final ModelIdentifier SOURCE_NOTEON_VELOCITY = + new ModelIdentifier("noteon", "velocity"); // midi velocity + public static final ModelIdentifier SOURCE_EG1 = + new ModelIdentifier("eg", null, 0); + public static final ModelIdentifier SOURCE_EG2 = + new ModelIdentifier("eg", null, 1); + public static final ModelIdentifier SOURCE_LFO1 = + new ModelIdentifier("lfo", null, 0); + public static final ModelIdentifier SOURCE_LFO2 = + new ModelIdentifier("lfo", null, 1); + public static final ModelIdentifier SOURCE_MIDI_PITCH = + new ModelIdentifier("midi", "pitch", 0); // (0..16383) + public static final ModelIdentifier SOURCE_MIDI_CHANNEL_PRESSURE = + new ModelIdentifier("midi", "channel_pressure", 0); // (0..127) +// public static final ModelIdentifier SOURCE_MIDI_MONO_PRESSURE = +// new ModelIdentifier("midi","mono_pressure",0); // (0..127) + public static final ModelIdentifier SOURCE_MIDI_POLY_PRESSURE = + new ModelIdentifier("midi", "poly_pressure", 0); // (0..127) + public static final ModelIdentifier SOURCE_MIDI_CC_0 = + new ModelIdentifier("midi_cc", "0", 0); // (0..127) + public static final ModelIdentifier SOURCE_MIDI_RPN_0 = + new ModelIdentifier("midi_rpn", "0", 0); // (0..16383) + private ModelIdentifier source = SOURCE_NONE; + private ModelTransform transform; + + public ModelSource() { + this.transform = new ModelStandardTransform(); + } + + public ModelSource(ModelIdentifier id) { + source = id; + this.transform = new ModelStandardTransform(); + } + + public ModelSource(ModelIdentifier id, boolean direction) { + source = id; + this.transform = new ModelStandardTransform(direction); + } + + public ModelSource(ModelIdentifier id, boolean direction, boolean polarity) { + source = id; + this.transform = new ModelStandardTransform(direction, polarity); + } + + public ModelSource(ModelIdentifier id, boolean direction, boolean polarity, + int transform) { + source = id; + this.transform = + new ModelStandardTransform(direction, polarity, transform); + } + + public ModelSource(ModelIdentifier id, ModelTransform transform) { + source = id; + this.transform = transform; + } + + public ModelIdentifier getIdentifier() { + return source; + } + + public void setIdentifier(ModelIdentifier source) { + this.source = source; + } + + public ModelTransform getTransform() { + return transform; + } + + public void setTransform(ModelTransform transform) { + this.transform = transform; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelStandardDirector.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelStandardDirector.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,86 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A standard director who chooses performers + * by there keyfrom,keyto,velfrom,velto properties. + * + * @author Karl Helgason + */ +public class ModelStandardDirector implements ModelDirector { + + ModelPerformer[] performers; + ModelDirectedPlayer player; + boolean noteOnUsed = false; + boolean noteOffUsed = false; + + public ModelStandardDirector(ModelPerformer[] performers, + ModelDirectedPlayer player) { + this.performers = performers; + this.player = player; + for (int i = 0; i < performers.length; i++) { + ModelPerformer p = performers[i]; + if (p.isReleaseTriggered()) { + noteOffUsed = true; + } else { + noteOnUsed = true; + } + } + } + + public void close() { + } + + public void noteOff(int noteNumber, int velocity) { + if (!noteOffUsed) + return; + for (int i = 0; i < performers.length; i++) { + ModelPerformer p = performers[i]; + if (p.getKeyFrom() <= noteNumber && p.getKeyTo() >= noteNumber) { + if (p.getVelFrom() <= velocity && p.getVelTo() >= velocity) { + if (p.isReleaseTriggered()) { + player.play(i, null); + } + } + } + } + } + + public void noteOn(int noteNumber, int velocity) { + if (!noteOnUsed) + return; + for (int i = 0; i < performers.length; i++) { + ModelPerformer p = performers[i]; + if (p.getKeyFrom() <= noteNumber && p.getKeyTo() >= noteNumber) { + if (p.getVelFrom() <= velocity && p.getVelTo() >= velocity) { + if (!p.isReleaseTriggered()) { + player.play(i, null); + } + } + } + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelStandardTransform.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelStandardTransform.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,139 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A standard transformer used in connection blocks. + * It expects input values to be between 0 and 1. + * + * The result of the transform is + * between 0 and 1 if polarity = unipolar and + * between -1 and 1 if polarity = bipolar. + * + * These constraints only applies to Concave, Convex and Switch transforms. + * + * @author Karl Helgason + */ +public class ModelStandardTransform implements ModelTransform { + + public static final boolean DIRECTION_MIN2MAX = false; + public static final boolean DIRECTION_MAX2MIN = true; + public static final boolean POLARITY_UNIPOLAR = false; + public static final boolean POLARITY_BIPOLAR = true; + public static final int TRANSFORM_LINEAR = 0; + // concave: output = (20*log10(127^2/value^2)) / 96 + public static final int TRANSFORM_CONCAVE = 1; + // convex: same as concave except that start and end point are reversed. + public static final int TRANSFORM_CONVEX = 2; + // switch: if value > avg(max,min) then max else min + public static final int TRANSFORM_SWITCH = 3; + public static final int TRANSFORM_ABSOLUTE = 4; + private boolean direction = DIRECTION_MIN2MAX; + private boolean polarity = POLARITY_UNIPOLAR; + private int transform = TRANSFORM_LINEAR; + + public ModelStandardTransform() { + } + + public ModelStandardTransform(boolean direction) { + this.direction = direction; + } + + public ModelStandardTransform(boolean direction, boolean polarity) { + this.direction = direction; + this.polarity = polarity; + } + + public ModelStandardTransform(boolean direction, boolean polarity, + int transform) { + this.direction = direction; + this.polarity = polarity; + this.transform = transform; + } + + public double transform(double value) { + double s; + double a; + if (direction == DIRECTION_MAX2MIN) + value = 1.0 - value; + if (polarity == POLARITY_BIPOLAR) + value = value * 2.0 - 1.0; + switch (transform) { + case TRANSFORM_CONCAVE: + s = Math.signum(value); + a = Math.abs(value); + a = -((5.0 / 12.0) / Math.log(10)) * Math.log(1.0 - a); + if (a < 0) + a = 0; + else if (a > 1) + a = 1; + return s * a; + case TRANSFORM_CONVEX: + s = Math.signum(value); + a = Math.abs(value); + a = 1.0 + ((5.0 / 12.0) / Math.log(10)) * Math.log(a); + if (a < 0) + a = 0; + else if (a > 1) + a = 1; + return s * a; + case TRANSFORM_SWITCH: + if (polarity == POLARITY_BIPOLAR) + return (value > 0) ? 1 : -1; + else + return (value > 0.5) ? 1 : 0; + case TRANSFORM_ABSOLUTE: + return Math.abs(value); + default: + break; + } + + return value; + } + + public boolean getDirection() { + return direction; + } + + public void setDirection(boolean direction) { + this.direction = direction; + } + + public boolean getPolarity() { + return polarity; + } + + public void setPolarity(boolean polarity) { + this.polarity = polarity; + } + + public int getTransform() { + return transform; + } + + public void setTransform(int transform) { + this.transform = transform; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelTransform.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelTransform.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Model transform interface. + * + * @author Karl Helgason + */ +public interface ModelTransform { + + abstract public double transform(double value); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/ModelWavetable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/ModelWavetable.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,49 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This is a wavetable oscillator interface. + * + * @author Karl Helgason + */ +public interface ModelWavetable extends ModelOscillator { + + public static final int LOOP_TYPE_OFF = 0; + public static final int LOOP_TYPE_FORWARD = 1; + public static final int LOOP_TYPE_RELEASE = 2; + public static final int LOOP_TYPE_PINGPONG = 4; + public static final int LOOP_TYPE_REVERSE = 8; + + public AudioFloatInputStream openStream(); + + public float getLoopLength(); + + public float getLoopStart(); + + public int getLoopType(); + + public float getPitchcorrection(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/Platform.java --- a/jdk/src/share/classes/com/sun/media/sound/Platform.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/Platform.java Thu Feb 05 09:24:45 2009 -0800 @@ -42,8 +42,6 @@ // native library we need to load private static final String libNameMain = "jsound"; - private static final String libNameMain2 = "jsoundhs"; - private static final String libNameALSA = "jsoundalsa"; private static final String libNameDSound = "jsoundds"; @@ -158,9 +156,8 @@ if(Printer.trace)Printer.trace(">>Platform.loadLibraries"); try { - // load the main libraries + // load the main library JSSecurityManager.loadLibrary(libNameMain); - JSSecurityManager.loadLibrary(libNameMain2); // just for the heck of it... loadedLibs |= LIB_MAIN; } catch (SecurityException e) { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/RIFFInvalidDataException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidDataException.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This exception is used when a RIFF file contains illegal or unexpected data. + * + * @author Karl Helgason + */ +public class RIFFInvalidDataException extends InvalidDataException { + + private static final long serialVersionUID = 1L; + + public RIFFInvalidDataException() { + super("Invalid Data!"); + } + + public RIFFInvalidDataException(String s) { + super(s); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This exception is used when a reader is used to read RIFF file of a format it + * doesn't unterstand or support. + * + * @author Karl Helgason + */ +public class RIFFInvalidFormatException extends InvalidFormatException { + + private static final long serialVersionUID = 1L; + + public RIFFInvalidFormatException() { + super("Invalid format!"); + } + + public RIFFInvalidFormatException(String s) { + super(s); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/RIFFReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,332 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +/** + * Resource Interchange File Format (RIFF) stream decoder. + * + * @author Karl Helgason + */ +public class RIFFReader extends InputStream { + + private RIFFReader root; + private long filepointer = 0; + private String fourcc; + private String riff_type = null; + private long ckSize = 0; + private InputStream stream; + private long avail; + private RIFFReader lastiterator = null; + + public RIFFReader(InputStream stream) throws IOException { + + if (stream instanceof RIFFReader) + root = ((RIFFReader)stream).root; + else + root = this; + + this.stream = stream; + avail = Integer.MAX_VALUE; + ckSize = Integer.MAX_VALUE; + + // Check for RIFF null paddings, + int b; + while (true) { + b = read(); + if (b == -1) { + fourcc = ""; // don't put null value into fourcc, + // because it is expected to + // always contain a string value + riff_type = null; + avail = 0; + return; + } + if (b != 0) + break; + } + + byte[] fourcc = new byte[4]; + fourcc[0] = (byte) b; + readFully(fourcc, 1, 3); + this.fourcc = new String(fourcc, "ascii"); + ckSize = readUnsignedInt(); + + avail = this.ckSize; + + if (getFormat().equals("RIFF") || getFormat().equals("LIST")) { + byte[] format = new byte[4]; + readFully(format); + this.riff_type = new String(format, "ascii"); + } + } + + public long getFilePointer() throws IOException { + return root.filepointer; + } + + public boolean hasNextChunk() throws IOException { + if (lastiterator != null) + lastiterator.finish(); + return avail != 0; + } + + public RIFFReader nextChunk() throws IOException { + if (lastiterator != null) + lastiterator.finish(); + if (avail == 0) + return null; + lastiterator = new RIFFReader(this); + return lastiterator; + } + + public String getFormat() { + return fourcc; + } + + public String getType() { + return riff_type; + } + + public long getSize() { + return ckSize; + } + + public int read() throws IOException { + if (avail == 0) + return -1; + int b = stream.read(); + if (b == -1) + return -1; + avail--; + filepointer++; + return b; + } + + public int read(byte[] b, int offset, int len) throws IOException { + if (avail == 0) + return -1; + if (len > avail) { + int rlen = stream.read(b, offset, (int)avail); + if (rlen != -1) + filepointer += rlen; + avail = 0; + return rlen; + } else { + int ret = stream.read(b, offset, len); + if (ret == -1) + return -1; + avail -= ret; + filepointer += ret; + return ret; + } + } + + public final void readFully(byte b[]) throws IOException { + readFully(b, 0, b.length); + } + + public final void readFully(byte b[], int off, int len) throws IOException { + if (len < 0) + throw new IndexOutOfBoundsException(); + while (len > 0) { + int s = read(b, off, len); + if (s < 0) + throw new EOFException(); + if (s == 0) + Thread.yield(); + off += s; + len -= s; + } + } + + public final long skipBytes(long n) throws IOException { + if (n < 0) + return 0; + long skipped = 0; + while (skipped != n) { + long s = skip(n - skipped); + if (s < 0) + break; + if (s == 0) + Thread.yield(); + skipped += s; + } + return skipped; + } + + public long skip(long n) throws IOException { + if (avail == 0) + return -1; + if (n > avail) { + long len = stream.skip(avail); + if (len != -1) + filepointer += len; + avail = 0; + return len; + } else { + long ret = stream.skip(n); + if (ret == -1) + return -1; + avail -= ret; + filepointer += ret; + return ret; + } + } + + public int available() { + return (int)avail; + } + + public void finish() throws IOException { + if (avail != 0) { + skipBytes(avail); + } + } + + // Read ASCII chars from stream + public String readString(int len) throws IOException { + byte[] buff = new byte[len]; + readFully(buff); + for (int i = 0; i < buff.length; i++) { + if (buff[i] == 0) { + return new String(buff, 0, i, "ascii"); + } + } + return new String(buff, "ascii"); + } + + // Read 8 bit signed integer from stream + public byte readByte() throws IOException { + int ch = read(); + if (ch < 0) + throw new EOFException(); + return (byte) ch; + } + + // Read 16 bit signed integer from stream + public short readShort() throws IOException { + int ch1 = read(); + int ch2 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + return (short)(ch1 | (ch2 << 8)); + } + + // Read 32 bit signed integer from stream + public int readInt() throws IOException { + int ch1 = read(); + int ch2 = read(); + int ch3 = read(); + int ch4 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + if (ch3 < 0) + throw new EOFException(); + if (ch4 < 0) + throw new EOFException(); + return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24); + } + + // Read 64 bit signed integer from stream + public long readLong() throws IOException { + long ch1 = read(); + long ch2 = read(); + long ch3 = read(); + long ch4 = read(); + long ch5 = read(); + long ch6 = read(); + long ch7 = read(); + long ch8 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + if (ch3 < 0) + throw new EOFException(); + if (ch4 < 0) + throw new EOFException(); + if (ch5 < 0) + throw new EOFException(); + if (ch6 < 0) + throw new EOFException(); + if (ch7 < 0) + throw new EOFException(); + if (ch8 < 0) + throw new EOFException(); + return ch1 | (ch2 << 8) | (ch3 << 16) | (ch4 << 24) + | (ch5 << 32) | (ch6 << 40) | (ch7 << 48) | (ch8 << 56); + } + + // Read 8 bit unsigned integer from stream + public int readUnsignedByte() throws IOException { + int ch = read(); + if (ch < 0) + throw new EOFException(); + return ch; + } + + // Read 16 bit unsigned integer from stream + public int readUnsignedShort() throws IOException { + int ch1 = read(); + int ch2 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + return ch1 | (ch2 << 8); + } + + // Read 32 bit unsigned integer from stream + public long readUnsignedInt() throws IOException { + long ch1 = read(); + long ch2 = read(); + long ch3 = read(); + long ch4 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + if (ch3 < 0) + throw new EOFException(); + if (ch4 < 0) + throw new EOFException(); + return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24); + } + + public void close() throws IOException { + finish(); + if (this == root) + stream.close(); + stream = null; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/RIFFWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFWriter.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,365 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import java.io.RandomAccessFile; + +/** + * Resource Interchange File Format (RIFF) stream encoder. + * + * @author Karl Helgason + */ +public class RIFFWriter extends OutputStream { + + private interface RandomAccessWriter { + + public void seek(long chunksizepointer) throws IOException; + + public long getPointer() throws IOException; + + public void close() throws IOException; + + public void write(int b) throws IOException; + + public void write(byte[] b, int off, int len) throws IOException; + + public void write(byte[] bytes) throws IOException; + + public long length() throws IOException; + + public void setLength(long i) throws IOException; + } + + private static class RandomAccessFileWriter implements RandomAccessWriter { + + RandomAccessFile raf; + + public RandomAccessFileWriter(File file) throws FileNotFoundException { + this.raf = new RandomAccessFile(file, "rw"); + } + + public RandomAccessFileWriter(String name) throws FileNotFoundException { + this.raf = new RandomAccessFile(name, "rw"); + } + + public void seek(long chunksizepointer) throws IOException { + raf.seek(chunksizepointer); + } + + public long getPointer() throws IOException { + return raf.getFilePointer(); + } + + public void close() throws IOException { + raf.close(); + } + + public void write(int b) throws IOException { + raf.write(b); + } + + public void write(byte[] b, int off, int len) throws IOException { + raf.write(b, off, len); + } + + public void write(byte[] bytes) throws IOException { + raf.write(bytes); + } + + public long length() throws IOException { + return raf.length(); + } + + public void setLength(long i) throws IOException { + raf.setLength(i); + } + } + + private static class RandomAccessByteWriter implements RandomAccessWriter { + + byte[] buff = new byte[32]; + int length = 0; + int pos = 0; + byte[] s; + OutputStream stream; + + public RandomAccessByteWriter(OutputStream stream) { + this.stream = stream; + } + + public void seek(long chunksizepointer) throws IOException { + pos = (int) chunksizepointer; + } + + public long getPointer() throws IOException { + return pos; + } + + public void close() throws IOException { + stream.write(buff, 0, length); + stream.close(); + } + + public void write(int b) throws IOException { + if (s == null) + s = new byte[1]; + s[0] = (byte)b; + write(s, 0, 1); + } + + public void write(byte[] b, int off, int len) throws IOException { + int newsize = pos + len; + if (newsize > length) + setLength(newsize); + int end = off + len; + for (int i = off; i < end; i++) { + buff[pos++] = b[i]; + } + } + + public void write(byte[] bytes) throws IOException { + write(bytes, 0, bytes.length); + } + + public long length() throws IOException { + return length; + } + + public void setLength(long i) throws IOException { + length = (int) i; + if (length > buff.length) { + int newlen = Math.max(buff.length << 1, length); + byte[] newbuff = new byte[newlen]; + System.arraycopy(buff, 0, newbuff, 0, buff.length); + buff = newbuff; + } + } + } + private int chunktype = 0; // 0=RIFF, 1=LIST; 2=CHUNK + private RandomAccessWriter raf; + private long chunksizepointer; + private long startpointer; + private RIFFWriter childchunk = null; + private boolean open = true; + private boolean writeoverride = false; + + public RIFFWriter(String name, String format) throws IOException { + this(new RandomAccessFileWriter(name), format, 0); + } + + public RIFFWriter(File file, String format) throws IOException { + this(new RandomAccessFileWriter(file), format, 0); + } + + public RIFFWriter(OutputStream stream, String format) throws IOException { + this(new RandomAccessByteWriter(stream), format, 0); + } + + private RIFFWriter(RandomAccessWriter raf, String format, int chunktype) + throws IOException { + if (chunktype == 0) + if (raf.length() != 0) + raf.setLength(0); + this.raf = raf; + if (raf.getPointer() % 2 != 0) + raf.write(0); + + if (chunktype == 0) + raf.write("RIFF".getBytes("ascii")); + else if (chunktype == 1) + raf.write("LIST".getBytes("ascii")); + else + raf.write((format + " ").substring(0, 4).getBytes("ascii")); + + chunksizepointer = raf.getPointer(); + this.chunktype = 2; + writeUnsignedInt(0); + this.chunktype = chunktype; + startpointer = raf.getPointer(); + if (chunktype != 2) + raf.write((format + " ").substring(0, 4).getBytes("ascii")); + + } + + public void seek(long pos) throws IOException { + raf.seek(pos); + } + + public long getFilePointer() throws IOException { + return raf.getPointer(); + } + + public void setWriteOverride(boolean writeoverride) { + this.writeoverride = writeoverride; + } + + public boolean getWriteOverride() { + return writeoverride; + } + + public void close() throws IOException { + if (!open) + return; + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + + int bakchunktype = chunktype; + long fpointer = raf.getPointer(); + raf.seek(chunksizepointer); + chunktype = 2; + writeUnsignedInt(fpointer - startpointer); + + if (bakchunktype == 0) + raf.close(); + else + raf.seek(fpointer); + open = false; + raf = null; + } + + public void write(int b) throws IOException { + if (!writeoverride) { + if (chunktype != 2) { + throw new IllegalArgumentException( + "Only chunks can write bytes!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + } + raf.write(b); + } + + public void write(byte b[], int off, int len) throws IOException { + if (!writeoverride) { + if (chunktype != 2) { + throw new IllegalArgumentException( + "Only chunks can write bytes!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + } + raf.write(b, off, len); + } + + public RIFFWriter writeList(String format) throws IOException { + if (chunktype == 2) { + throw new IllegalArgumentException( + "Only LIST and RIFF can write lists!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + childchunk = new RIFFWriter(this.raf, format, 1); + return childchunk; + } + + public RIFFWriter writeChunk(String format) throws IOException { + if (chunktype == 2) { + throw new IllegalArgumentException( + "Only LIST and RIFF can write chunks!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + childchunk = new RIFFWriter(this.raf, format, 2); + return childchunk; + } + + // Write ASCII chars to stream + public void writeString(String string) throws IOException { + byte[] buff = string.getBytes(); + write(buff); + } + + // Write ASCII chars to stream + public void writeString(String string, int len) throws IOException { + byte[] buff = string.getBytes(); + if (buff.length > len) + write(buff, 0, len); + else { + write(buff); + for (int i = buff.length; i < len; i++) + write(0); + } + } + + // Write 8 bit signed integer to stream + public void writeByte(int b) throws IOException { + write(b); + } + + // Write 16 bit signed integer to stream + public void writeShort(short b) throws IOException { + write((b >>> 0) & 0xFF); + write((b >>> 8) & 0xFF); + } + + // Write 32 bit signed integer to stream + public void writeInt(int b) throws IOException { + write((b >>> 0) & 0xFF); + write((b >>> 8) & 0xFF); + write((b >>> 16) & 0xFF); + write((b >>> 24) & 0xFF); + } + + // Write 64 bit signed integer to stream + public void writeLong(long b) throws IOException { + write((int) (b >>> 0) & 0xFF); + write((int) (b >>> 8) & 0xFF); + write((int) (b >>> 16) & 0xFF); + write((int) (b >>> 24) & 0xFF); + write((int) (b >>> 32) & 0xFF); + write((int) (b >>> 40) & 0xFF); + write((int) (b >>> 48) & 0xFF); + write((int) (b >>> 56) & 0xFF); + } + + // Write 8 bit unsigned integer to stream + public void writeUnsignedByte(int b) throws IOException { + writeByte((byte) b); + } + + // Write 16 bit unsigned integer to stream + public void writeUnsignedShort(int b) throws IOException { + writeShort((short) b); + } + + // Write 32 bit unsigned integer to stream + public void writeUnsignedInt(long b) throws IOException { + writeInt((int) b); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java --- a/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java Thu Feb 05 09:24:45 2009 -0800 @@ -54,10 +54,6 @@ private final static boolean DEBUG_PUMP = false; private final static boolean DEBUG_PUMP_ALL = false; - - /** if true, we bridge RMF files over to the old MixerSequencer */ - private final static boolean RMF = true; - /** * Event Dispatcher thread. Should be using a shared event * dispatcher instance with a factory in EventDispatcher @@ -145,9 +141,6 @@ private ArrayList controllerEventListeners = new ArrayList(); - /** for RMF media we need the RMF sequencer */ - private MixerSequencer seqBridge = null; - /** automatic connection support */ private boolean autoConnect = false; @@ -220,21 +213,6 @@ playThread.setSequence(sequence); } } - if (RMF) { - if (seqBridge != null) { - seqBridge.close(); - seqBridge = null; - } - // if previous file was an RMF, but this file is not RMF, - // then need to call implOpen again! - if (isOpen() && sequence != null && playThread == null) { - try { - implOpen(); - } catch (MidiUnavailableException mue) { - if (Printer.err) mue.printStackTrace(); - } - } - } if (Printer.trace) Printer.trace("<< RealTimeSequencer: setSequence(" + sequence +") completed"); } @@ -249,52 +227,6 @@ return; } - // need to be able to detect RMF - if (RMF) { - MidiFileFormat fileFormat = MidiSystem.getMidiFileFormat(stream); // can throw IOException, InvalidMidiDataException - int type = fileFormat.getType(); - int resolution = fileFormat.getResolution(); - if (Printer.debug) Printer.debug("Got file with type="+type+" and resolution="+resolution); - if (resolution == MidiFileFormat.UNKNOWN_LENGTH) { - // seems to be RMF - if (seqBridge == null) { - try { - seqBridge = new MixerSequencer(); - if (isOpen()) { - seqBridge.open(); - } - } catch (MidiUnavailableException mue) { - // uhum, strange situation. Need to cast to InvalidMidiDataException - throw new InvalidMidiDataException(mue.getMessage()); - } - } - seqBridge.setSequence(stream); - // propagate state - seqBridge.setTempoFactor(getTempoFactor()); - - // propagate listeners - synchronized(metaEventListeners) { - for (int i = 0 ; i < metaEventListeners.size(); i++) { - seqBridge.addMetaEventListener((MetaEventListener) (metaEventListeners.get(i))); - } - } - synchronized(controllerEventListeners) { - for (int i = 0 ; i < controllerEventListeners.size(); i++) { - ControllerListElement cve = (ControllerListElement) (controllerEventListeners.get(i)); - seqBridge.addControllerEventListener(cve.listener, cve.controllers); - } - } - // disable the current sequence of RealTimeSequencer - //setSequence((Sequence) null); -> will remove bridge again! - this.sequence = null; - return; - } - if (seqBridge != null) { - seqBridge.close(); - seqBridge = null; - } - } - Sequence seq = MidiSystem.getSequence(stream); // can throw IOException, InvalidMidiDataException setSequence(seq); @@ -305,22 +237,11 @@ public Sequence getSequence() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getSequence(); - } - } return sequence; } public synchronized void start() { - if (RMF) { - if (seqBridge != null) { - seqBridge.start(); - return; - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: start()"); // sequencer not open: throw an exception @@ -346,12 +267,6 @@ public synchronized void stop() { - if (RMF) { - if (seqBridge != null) { - seqBridge.stop(); - return; - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: stop()"); if (!isOpen()) { @@ -373,23 +288,11 @@ public boolean isRunning() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.isRunning(); - } - } return running; } public void startRecording() { - if (RMF) { - if (seqBridge != null) { - seqBridge.startRecording(); - return; - } - } - if (!isOpen()) { throw new IllegalStateException("Sequencer not open"); } @@ -400,13 +303,6 @@ public void stopRecording() { - if (RMF) { - if (seqBridge != null) { - seqBridge.stopRecording(); - return; - } - } - if (!isOpen()) { throw new IllegalStateException("Sequencer not open"); } @@ -415,23 +311,11 @@ public boolean isRecording() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.isRecording(); - } - } return recording; } public void recordEnable(Track track, int channel) { - if (RMF) { - if (seqBridge != null) { - seqBridge.recordEnable(track, channel); - return; - } - } - if (!findTrack(track)) { throw new IllegalArgumentException("Track does not exist in the current sequence"); } @@ -449,13 +333,6 @@ public void recordDisable(Track track) { - if (RMF) { - if (seqBridge != null) { - seqBridge.recordDisable(track); - return; - } - } - synchronized(recordingTracks) { RecordingTrack rc = RecordingTrack.get(recordingTracks, track); if (rc != null) { @@ -482,11 +359,6 @@ public float getTempoInBPM() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTempoInBPM(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInBPM() "); return (float) MidiUtils.convertTempo(getTempoInMPQ()); @@ -494,12 +366,6 @@ public void setTempoInBPM(float bpm) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTempoInBPM(bpm); - return; - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: setTempoInBPM() "); if (bpm <= 0) { // should throw IllegalArgumentException @@ -511,12 +377,6 @@ public float getTempoInMPQ() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTempoInMPQ(); - } - } - if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInMPQ() "); if (needCaching()) { @@ -537,12 +397,6 @@ public void setTempoInMPQ(float mpq) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTempoInMPQ(mpq); - return; - } - } if (mpq <= 0) { // should throw IllegalArgumentException mpq = 1.0f; @@ -564,12 +418,6 @@ public void setTempoFactor(float factor) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTempoFactor(factor); - return; - } - } if (factor <= 0) { // should throw IllegalArgumentException return; @@ -588,11 +436,6 @@ public float getTempoFactor() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTempoFactor(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoFactor() "); if (needCaching()) { @@ -606,11 +449,6 @@ public long getTickLength() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTickLength(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickLength() "); if (sequence == null) { @@ -622,11 +460,6 @@ public synchronized long getTickPosition() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTickPosition(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickPosition() "); if (getDataPump() == null || sequence == null) { @@ -638,12 +471,6 @@ public synchronized void setTickPosition(long tick) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTickPosition(tick); - return; - } - } if (tick < 0) { // should throw IllegalArgumentException return; @@ -667,12 +494,6 @@ public long getMicrosecondLength() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMicrosecondLength(); - } - } - if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondLength() "); if (sequence == null) { @@ -684,12 +505,6 @@ public long getMicrosecondPosition() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMicrosecondPosition(); - } - } - if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondPosition() "); if (getDataPump() == null || sequence == null) { @@ -702,13 +517,6 @@ public void setMicrosecondPosition(long microseconds) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setMicrosecondPosition(microseconds); - return; - } - } - if (microseconds < 0) { // should throw IllegalArgumentException return; @@ -734,33 +542,16 @@ public void setMasterSyncMode(Sequencer.SyncMode sync) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setMasterSyncMode(sync); - return; - } - } // not supported } public Sequencer.SyncMode getMasterSyncMode() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMasterSyncMode(); - } - } return masterSyncMode; } public Sequencer.SyncMode[] getMasterSyncModes() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMasterSyncModes(); - } - } - Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[masterSyncModes.length]; System.arraycopy(masterSyncModes, 0, returnedModes, 0, masterSyncModes.length); return returnedModes; @@ -768,33 +559,16 @@ public void setSlaveSyncMode(Sequencer.SyncMode sync) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setSlaveSyncMode(sync); - return; - } - } // not supported } public Sequencer.SyncMode getSlaveSyncMode() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getSlaveSyncMode(); - } - } return slaveSyncMode; } public Sequencer.SyncMode[] getSlaveSyncModes() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getSlaveSyncModes(); - } - } - Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[slaveSyncModes.length]; System.arraycopy(slaveSyncModes, 0, returnedModes, 0, slaveSyncModes.length); return returnedModes; @@ -812,12 +586,6 @@ public synchronized void setTrackMute(int track, boolean mute) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTrackMute(track, mute); - return; - } - } int trackCount = getTrackCount(); if (track < 0 || track >= getTrackCount()) return; trackMuted = ensureBoolArraySize(trackMuted, trackCount); @@ -829,11 +597,6 @@ public synchronized boolean getTrackMute(int track) { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTrackMute(track); - } - } if (track < 0 || track >= getTrackCount()) return false; if (trackMuted == null || trackMuted.length <= track) return false; return trackMuted[track]; @@ -841,12 +604,6 @@ public synchronized void setTrackSolo(int track, boolean solo) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTrackSolo(track, solo); - return; - } - } int trackCount = getTrackCount(); if (track < 0 || track >= getTrackCount()) return; trackSolo = ensureBoolArraySize(trackSolo, trackCount); @@ -858,11 +615,6 @@ public synchronized boolean getTrackSolo(int track) { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTrackSolo(track); - } - } if (track < 0 || track >= getTrackCount()) return false; if (trackSolo == null || trackSolo.length <= track) return false; return trackSolo[track]; @@ -870,12 +622,6 @@ public boolean addMetaEventListener(MetaEventListener listener) { - if (RMF) { - if (seqBridge != null) { - seqBridge.addMetaEventListener(listener); - // do not return here! - } - } synchronized(metaEventListeners) { if (! metaEventListeners.contains(listener)) { @@ -887,12 +633,6 @@ public void removeMetaEventListener(MetaEventListener listener) { - if (RMF) { - if (seqBridge != null) { - seqBridge.removeMetaEventListener(listener); - // do not return here! - } - } synchronized(metaEventListeners) { int index = metaEventListeners.indexOf(listener); if (index >= 0) { @@ -903,13 +643,6 @@ public int[] addControllerEventListener(ControllerEventListener listener, int[] controllers) { - if (RMF) { - if (seqBridge != null) { - seqBridge.addControllerEventListener(listener, controllers); - // do not return here! - } - } - synchronized(controllerEventListeners) { // first find the listener. if we have one, add the controllers @@ -938,12 +671,6 @@ public int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers) { - if (RMF) { - if (seqBridge != null) { - seqBridge.removeControllerEventListener(listener, controllers); - // do not return here! - } - } synchronized(controllerEventListeners) { ControllerListElement cve = null; boolean flag = false; @@ -973,12 +700,6 @@ ////////////////// LOOPING (added in 1.5) /////////////////////// public void setLoopStartPoint(long tick) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setLoopStartPoint(tick); - return; - } - } if ((tick > getTickLength()) || ((loopEnd != -1) && (tick > loopEnd)) || (tick < 0)) { @@ -988,21 +709,10 @@ } public long getLoopStartPoint() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getLoopStartPoint(); - } - } return loopStart; } public void setLoopEndPoint(long tick) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setLoopEndPoint(tick); - return; - } - } if ((tick > getTickLength()) || ((loopStart > tick) && (tick != -1)) || (tick < -1)) { @@ -1012,21 +722,10 @@ } public long getLoopEndPoint() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getLoopEndPoint(); - } - } return loopEnd; } public void setLoopCount(int count) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setLoopCount(count); - return; - } - } if (count != LOOP_CONTINUOUSLY && count < 0) { throw new IllegalArgumentException("illegal value for loop count: "+count); @@ -1038,11 +737,6 @@ } public int getLoopCount() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getLoopCount(); - } - } return loopCount; } @@ -1053,13 +747,6 @@ */ protected void implOpen() throws MidiUnavailableException { if (Printer.trace) Printer.trace(">> RealTimeSequencer: implOpen()"); - if (RMF) { - if (seqBridge != null) { - seqBridge.open(); - if (Printer.trace) Printer.trace("<< RealTimeSequencer: -> called seqBridge.open"); - return; - } - } //openInternalSynth(); @@ -1095,12 +782,6 @@ synth.open(); if (synth instanceof ReferenceCountingDevice) { rec = ((ReferenceCountingDevice) synth).getReceiverReferenceCounting(); - if (synth.getClass().toString().contains("com.sun.media.sound.MixerSynth") - && (synth.getDefaultSoundbank() == null)) { - // don't use this receiver if no soundbank available - rec = null; - synth.close(); - } } else { rec = synth.getReceiver(); } @@ -1147,12 +828,6 @@ protected synchronized void implClose() { - if (RMF) { - if (seqBridge != null) { - seqBridge.close(); - // don't return here! - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: implClose() "); if (playThread == null) { @@ -1302,12 +977,6 @@ // OVERRIDES OF ABSTRACT MIDI DEVICE METHODS protected boolean hasReceivers() { - if (RMF) { - if (seqBridge != null) { - //RMF does not allow recording - return false; - } - } return true; } @@ -1318,12 +987,6 @@ protected boolean hasTransmitters() { - if (RMF) { - if (seqBridge != null) { - //RMF does never allow setting own receivers - return false; - } - } return true; } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2GlobalRegion.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2GlobalRegion.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,33 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont global region. + * + * @author Karl Helgason + */ +public class SF2GlobalRegion extends SF2Region { +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2Instrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Instrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,911 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Patch; + +/** + * Soundfont instrument. + * + * @author Karl Helgason + */ +public class SF2Instrument extends ModelInstrument { + + protected String name = ""; + protected int preset = 0; + protected int bank = 0; + protected long library = 0; + protected long genre = 0; + protected long morphology = 0; + protected SF2GlobalRegion globalregion = null; + protected List regions + = new ArrayList(); + + public SF2Instrument() { + super(null, null, null, null); + } + + public SF2Instrument(SF2Soundbank soundbank) { + super(soundbank, null, null, null); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Patch getPatch() { + if (bank == 128) + return new ModelPatch(0, preset, true); + else + return new ModelPatch(bank << 7, preset, false); + } + + public void setPatch(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch) patch).isPercussion()) { + bank = 128; + preset = patch.getProgram(); + } else { + bank = patch.getBank() >> 7; + preset = patch.getProgram(); + } + } + + public Object getData() { + return null; + } + + public long getGenre() { + return genre; + } + + public void setGenre(long genre) { + this.genre = genre; + } + + public long getLibrary() { + return library; + } + + public void setLibrary(long library) { + this.library = library; + } + + public long getMorphology() { + return morphology; + } + + public void setMorphology(long morphology) { + this.morphology = morphology; + } + + public List getRegions() { + return regions; + } + + public SF2GlobalRegion getGlobalRegion() { + return globalregion; + } + + public void setGlobalZone(SF2GlobalRegion zone) { + globalregion = zone; + } + + public String toString() { + if (bank == 128) + return "Drumkit: " + name + " preset #" + preset; + else + return "Instrument: " + name + " bank #" + bank + + " preset #" + preset; + } + + public ModelPerformer[] getPerformers() { + int performercount = 0; + for (SF2InstrumentRegion presetzone : regions) + performercount += presetzone.getLayer().getRegions().size(); + ModelPerformer[] performers = new ModelPerformer[performercount]; + int pi = 0; + + SF2GlobalRegion presetglobal = globalregion; + for (SF2InstrumentRegion presetzone : regions) { + Map pgenerators = new HashMap(); + pgenerators.putAll(presetzone.getGenerators()); + if (presetglobal != null) + pgenerators.putAll(presetglobal.getGenerators()); + + SF2Layer layer = presetzone.getLayer(); + SF2GlobalRegion layerglobal = layer.getGlobalRegion(); + for (SF2LayerRegion layerzone : layer.getRegions()) { + ModelPerformer performer = new ModelPerformer(); + if (layerzone.getSample() != null) + performer.setName(layerzone.getSample().getName()); + else + performer.setName(layer.getName()); + + performers[pi++] = performer; + + int keyfrom = 0; + int keyto = 127; + int velfrom = 0; + int velto = 127; + + if (layerzone.contains(SF2Region.GENERATOR_EXCLUSIVECLASS)) { + performer.setExclusiveClass(layerzone.getInteger( + SF2Region.GENERATOR_EXCLUSIVECLASS)); + } + if (layerzone.contains(SF2Region.GENERATOR_KEYRANGE)) { + byte[] bytes = layerzone.getBytes( + SF2Region.GENERATOR_KEYRANGE); + if (bytes[0] >= 0) + if (bytes[0] > keyfrom) + keyfrom = bytes[0]; + if (bytes[1] >= 0) + if (bytes[1] < keyto) + keyto = bytes[1]; + } + if (layerzone.contains(SF2Region.GENERATOR_VELRANGE)) { + byte[] bytes = layerzone.getBytes( + SF2Region.GENERATOR_VELRANGE); + if (bytes[0] >= 0) + if (bytes[0] > velfrom) + velfrom = bytes[0]; + if (bytes[1] >= 0) + if (bytes[1] < velto) + velto = bytes[1]; + } + if (presetzone.contains(SF2Region.GENERATOR_KEYRANGE)) { + byte[] bytes = presetzone.getBytes( + SF2Region.GENERATOR_KEYRANGE); + if (bytes[0] > keyfrom) + keyfrom = bytes[0]; + if (bytes[1] < keyto) + keyto = bytes[1]; + } + if (presetzone.contains(SF2Region.GENERATOR_VELRANGE)) { + byte[] bytes = presetzone.getBytes( + SF2Region.GENERATOR_VELRANGE); + if (bytes[0] > velfrom) + velfrom = bytes[0]; + if (bytes[1] < velto) + velto = bytes[1]; + } + performer.setKeyFrom(keyfrom); + performer.setKeyTo(keyto); + performer.setVelFrom(velfrom); + performer.setVelTo(velto); + + int startAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_STARTADDRSOFFSET); + int endAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_ENDADDRSOFFSET); + int startloopAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_STARTLOOPADDRSOFFSET); + int endloopAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_ENDLOOPADDRSOFFSET); + + startAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_STARTADDRSCOARSEOFFSET) * 32768; + endAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_ENDADDRSCOARSEOFFSET) * 32768; + startloopAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_STARTLOOPADDRSCOARSEOFFSET) * 32768; + endloopAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_ENDLOOPADDRSCOARSEOFFSET) * 32768; + startloopAddrsOffset -= startAddrsOffset; + endloopAddrsOffset -= startAddrsOffset; + + SF2Sample sample = layerzone.getSample(); + int rootkey = sample.originalPitch; + if (layerzone.getShort(SF2Region.GENERATOR_OVERRIDINGROOTKEY) != -1) { + rootkey = layerzone.getShort( + SF2Region.GENERATOR_OVERRIDINGROOTKEY); + } + float pitchcorrection = (-rootkey * 100) + sample.pitchCorrection; + ModelByteBuffer buff = sample.getDataBuffer(); + ModelByteBuffer buff24 = sample.getData24Buffer(); + + if (startAddrsOffset != 0 || endAddrsOffset != 0) { + buff = buff.subbuffer(startAddrsOffset * 2, + buff.capacity() + endAddrsOffset * 2); + if (buff24 != null) { + buff24 = buff24.subbuffer(startAddrsOffset, + buff24.capacity() + endAddrsOffset); + } + + /* + if (startAddrsOffset < 0) + startAddrsOffset = 0; + if (endAddrsOffset > (buff.capacity()/2-startAddrsOffset)) + startAddrsOffset = (int)buff.capacity()/2-startAddrsOffset; + byte[] data = buff.array(); + int off = (int)buff.arrayOffset() + startAddrsOffset*2; + int len = (int)buff.capacity() + endAddrsOffset*2; + if (off+len > data.length) + len = data.length - off; + buff = new ModelByteBuffer(data, off, len); + if(buff24 != null) { + data = buff.array(); + off = (int)buff.arrayOffset() + startAddrsOffset; + len = (int)buff.capacity() + endAddrsOffset; + buff24 = new ModelByteBuffer(data, off, len); + } + */ + } + + ModelByteBufferWavetable osc = new ModelByteBufferWavetable( + buff, sample.getFormat(), pitchcorrection); + if (buff24 != null) + osc.set8BitExtensionBuffer(buff24); + + Map generators = new HashMap(); + if (layerglobal != null) + generators.putAll(layerglobal.getGenerators()); + generators.putAll(layerzone.getGenerators()); + for (Map.Entry gen : pgenerators.entrySet()) { + short val; + if (!generators.containsKey(gen.getKey())) + val = layerzone.getShort(gen.getKey()); + else + val = generators.get(gen.getKey()); + val += gen.getValue(); + generators.put(gen.getKey(), val); + } + + // SampleMode: + // 0 indicates a sound reproduced with no loop + // 1 indicates a sound which loops continuously + // 2 is unused but should be interpreted as indicating no loop + // 3 indicates a sound which loops for the duration of key + // depression then proceeds to play the remainder of the sample. + int sampleMode = getGeneratorValue(generators, + SF2Region.GENERATOR_SAMPLEMODES); + if ((sampleMode == 1) || (sampleMode == 3)) { + if (sample.startLoop >= 0 && sample.endLoop > 0) { + osc.setLoopStart((int)(sample.startLoop + + startloopAddrsOffset)); + osc.setLoopLength((int)(sample.endLoop - sample.startLoop + + endloopAddrsOffset - startloopAddrsOffset)); + if (sampleMode == 1) + osc.setLoopType(ModelWavetable.LOOP_TYPE_FORWARD); + if (sampleMode == 3) + osc.setLoopType(ModelWavetable.LOOP_TYPE_RELEASE); + } + } + performer.getOscillators().add(osc); + + + short volDelay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYVOLENV); + short volAttack = getGeneratorValue(generators, + SF2Region.GENERATOR_ATTACKVOLENV); + short volHold = getGeneratorValue(generators, + SF2Region.GENERATOR_HOLDVOLENV); + short volDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_DECAYVOLENV); + short volSustain = getGeneratorValue(generators, + SF2Region.GENERATOR_SUSTAINVOLENV); + short volRelease = getGeneratorValue(generators, + SF2Region.GENERATOR_RELEASEVOLENV); + + if (volHold != -12000) { + short volKeyNumToHold = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOVOLENVHOLD); + volHold += 60 * volKeyNumToHold; + float fvalue = -volKeyNumToHold * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG1_HOLD; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), fvalue, + new ModelDestination(dest))); + } + if (volDecay != -12000) { + short volKeyNumToDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOVOLENVDECAY); + volDecay += 60 * volKeyNumToDecay; + float fvalue = -volKeyNumToDecay * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG1_DECAY; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), fvalue, + new ModelDestination(dest))); + } + + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_DELAY, volDelay); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_ATTACK, volAttack); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_HOLD, volHold); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_DECAY, volDecay); + //float fvolsustain = (960-volSustain)*(1000.0f/960.0f); + + volSustain = (short)(1000 - volSustain); + if (volSustain < 0) + volSustain = 0; + if (volSustain > 1000) + volSustain = 1000; + + addValue(performer, + ModelDestination.DESTINATION_EG1_SUSTAIN, volSustain); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_RELEASE, volRelease); + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOFILTERFC) != 0 + || getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOPITCH) != 0) { + short modDelay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYMODENV); + short modAttack = getGeneratorValue(generators, + SF2Region.GENERATOR_ATTACKMODENV); + short modHold = getGeneratorValue(generators, + SF2Region.GENERATOR_HOLDMODENV); + short modDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_DECAYMODENV); + short modSustain = getGeneratorValue(generators, + SF2Region.GENERATOR_SUSTAINMODENV); + short modRelease = getGeneratorValue(generators, + SF2Region.GENERATOR_RELEASEMODENV); + + + if (modHold != -12000) { + short modKeyNumToHold = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOMODENVHOLD); + modHold += 60 * modKeyNumToHold; + float fvalue = -modKeyNumToHold * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG2_HOLD; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + if (modDecay != -12000) { + short modKeyNumToDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOMODENVDECAY); + modDecay += 60 * modKeyNumToDecay; + float fvalue = -modKeyNumToDecay * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG2_DECAY; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_DELAY, modDelay); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_ATTACK, modAttack); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_HOLD, modHold); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_DECAY, modDecay); + if (modSustain < 0) + modSustain = 0; + if (modSustain > 1000) + modSustain = 1000; + addValue(performer, ModelDestination.DESTINATION_EG2_SUSTAIN, + 1000 - modSustain); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_RELEASE, modRelease); + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOFILTERFC) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOFILTERFC); + ModelIdentifier src = ModelSource.SOURCE_EG2; + ModelIdentifier dest + = ModelDestination.DESTINATION_FILTER_FREQ; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOPITCH) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOPITCH); + ModelIdentifier src = ModelSource.SOURCE_EG2; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOFILTERFC) != 0 + || getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOPITCH) != 0 + || getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOVOLUME) != 0) { + short lfo_freq = getGeneratorValue(generators, + SF2Region.GENERATOR_FREQMODLFO); + short lfo_delay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYMODLFO); + addTimecentValue(performer, + ModelDestination.DESTINATION_LFO1_DELAY, lfo_delay); + addValue(performer, + ModelDestination.DESTINATION_LFO1_FREQ, lfo_freq); + } + + short vib_freq = getGeneratorValue(generators, + SF2Region.GENERATOR_FREQVIBLFO); + short vib_delay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYVIBLFO); + addTimecentValue(performer, + ModelDestination.DESTINATION_LFO2_DELAY, vib_delay); + addValue(performer, + ModelDestination.DESTINATION_LFO2_FREQ, vib_freq); + + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_VIBLFOTOPITCH) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_VIBLFOTOPITCH); + ModelIdentifier src = ModelSource.SOURCE_LFO2; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOFILTERFC) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOFILTERFC); + ModelIdentifier src = ModelSource.SOURCE_LFO1; + ModelIdentifier dest = ModelDestination.DESTINATION_FILTER_FREQ; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOPITCH) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOPITCH); + ModelIdentifier src = ModelSource.SOURCE_LFO1; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOVOLUME) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOVOLUME); + ModelIdentifier src = ModelSource.SOURCE_LFO1; + ModelIdentifier dest = ModelDestination.DESTINATION_GAIN; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (layerzone.getShort(SF2Region.GENERATOR_KEYNUM) != -1) { + double val = layerzone.getShort(SF2Region.GENERATOR_KEYNUM)/128.0; + addValue(performer, ModelDestination.DESTINATION_KEYNUMBER, val); + } + + if (layerzone.getShort(SF2Region.GENERATOR_VELOCITY) != -1) { + double val = layerzone.getShort(SF2Region.GENERATOR_VELOCITY) + / 128.0; + addValue(performer, ModelDestination.DESTINATION_VELOCITY, val); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALFILTERFC) < 13500) { + short filter_freq = getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALFILTERFC); + short filter_q = getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALFILTERQ); + addValue(performer, + ModelDestination.DESTINATION_FILTER_FREQ, filter_freq); + addValue(performer, + ModelDestination.DESTINATION_FILTER_Q, filter_q); + } + + int tune = 100 * getGeneratorValue(generators, + SF2Region.GENERATOR_COARSETUNE); + tune += getGeneratorValue(generators, + SF2Region.GENERATOR_FINETUNE); + if (tune != 0) { + addValue(performer, + ModelDestination.DESTINATION_PITCH, (short) tune); + } + if (getGeneratorValue(generators, SF2Region.GENERATOR_PAN) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_PAN); + addValue(performer, ModelDestination.DESTINATION_PAN, val); + } + if (getGeneratorValue(generators, SF2Region.GENERATOR_INITIALATTENUATION) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALATTENUATION); + addValue(performer, + ModelDestination.DESTINATION_GAIN, -0.376287f * val); + } + if (getGeneratorValue(generators, + SF2Region.GENERATOR_CHORUSEFFECTSSEND) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_CHORUSEFFECTSSEND); + addValue(performer, ModelDestination.DESTINATION_CHORUS, val); + } + if (getGeneratorValue(generators, + SF2Region.GENERATOR_REVERBEFFECTSSEND) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_REVERBEFFECTSSEND); + addValue(performer, ModelDestination.DESTINATION_REVERB, val); + } + if (getGeneratorValue(generators, + SF2Region.GENERATOR_SCALETUNING) != 100) { + short fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_SCALETUNING); + if (fvalue == 0) { + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(null, rootkey * 100, + new ModelDestination(dest))); + } else { + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(null, rootkey * (100 - fvalue), + new ModelDestination(dest))); + } + + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + 128 * fvalue, new ModelDestination(dest))); + + } + + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_NOTEON_VELOCITY, + new ModelTransform() { + public double transform(double value) { + if (value < 0.5) + return 1 - value * 2; + else + return 0; + } + }), + -2400, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ))); + + + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(new ModelIdentifier("midi_cc", "1", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 50, new ModelDestination( + ModelDestination.DESTINATION_PITCH))); + + if (layer.getGlobalRegion() != null) { + for (SF2Modulator modulator + : layer.getGlobalRegion().getModulators()) { + convertModulator(performer, modulator); + } + } + for (SF2Modulator modulator : layerzone.getModulators()) + convertModulator(performer, modulator); + + if (presetglobal != null) { + for (SF2Modulator modulator : presetglobal.getModulators()) + convertModulator(performer, modulator); + } + for (SF2Modulator modulator : presetzone.getModulators()) + convertModulator(performer, modulator); + + } + } + return performers; + } + + private void convertModulator(ModelPerformer performer, + SF2Modulator modulator) { + ModelSource src1 = convertSource(modulator.getSourceOperator()); + ModelSource src2 = convertSource(modulator.getAmountSourceOperator()); + if (src1 == null && modulator.getSourceOperator() != 0) + return; + if (src2 == null && modulator.getAmountSourceOperator() != 0) + return; + double amount = modulator.getAmount(); + double[] amountcorrection = new double[1]; + ModelSource[] extrasrc = new ModelSource[1]; + amountcorrection[0] = 1; + ModelDestination dst = convertDestination( + modulator.getDestinationOperator(), amountcorrection, extrasrc); + amount *= amountcorrection[0]; + if (dst == null) + return; + if (modulator.getTransportOperator() == SF2Modulator.TRANSFORM_ABSOLUTE) { + ((ModelStandardTransform)dst.getTransform()).setTransform( + ModelStandardTransform.TRANSFORM_ABSOLUTE); + } + ModelConnectionBlock conn = new ModelConnectionBlock(src1, src2, amount, dst); + if (extrasrc[0] != null) + conn.addSource(extrasrc[0]); + performer.getConnectionBlocks().add(conn); + + } + + private static ModelSource convertSource(int src) { + if (src == 0) + return null; + ModelIdentifier id = null; + int idsrc = src & 0x7F; + if ((src & SF2Modulator.SOURCE_MIDI_CONTROL) != 0) { + id = new ModelIdentifier("midi_cc", Integer.toString(idsrc)); + } else { + if (idsrc == SF2Modulator.SOURCE_NOTE_ON_VELOCITY) + id = ModelSource.SOURCE_NOTEON_VELOCITY; + if (idsrc == SF2Modulator.SOURCE_NOTE_ON_KEYNUMBER) + id = ModelSource.SOURCE_NOTEON_KEYNUMBER; + if (idsrc == SF2Modulator.SOURCE_POLY_PRESSURE) + id = ModelSource.SOURCE_MIDI_POLY_PRESSURE; + if (idsrc == SF2Modulator.SOURCE_CHANNEL_PRESSURE) + id = ModelSource.SOURCE_MIDI_CHANNEL_PRESSURE; + if (idsrc == SF2Modulator.SOURCE_PITCH_WHEEL) + id = ModelSource.SOURCE_MIDI_PITCH; + if (idsrc == SF2Modulator.SOURCE_PITCH_SENSITIVITY) + id = new ModelIdentifier("midi_rpn", "0"); + } + if (id == null) + return null; + + ModelSource msrc = new ModelSource(id); + ModelStandardTransform transform + = (ModelStandardTransform) msrc.getTransform(); + + if ((SF2Modulator.SOURCE_DIRECTION_MAX_MIN & src) != 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + + if ((SF2Modulator.SOURCE_POLARITY_BIPOLAR & src) != 0) + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + + if ((SF2Modulator.SOURCE_TYPE_CONCAVE & src) != 0) + transform.setTransform(ModelStandardTransform.TRANSFORM_CONCAVE); + if ((SF2Modulator.SOURCE_TYPE_CONVEX & src) != 0) + transform.setTransform(ModelStandardTransform.TRANSFORM_CONVEX); + if ((SF2Modulator.SOURCE_TYPE_SWITCH & src) != 0) + transform.setTransform(ModelStandardTransform.TRANSFORM_SWITCH); + + return msrc; + } + + protected static ModelDestination convertDestination(int dst, + double[] amountcorrection, ModelSource[] extrasrc) { + ModelIdentifier id = null; + switch (dst) { + case SF2Region.GENERATOR_INITIALFILTERFC: + id = ModelDestination.DESTINATION_FILTER_FREQ; + break; + case SF2Region.GENERATOR_INITIALFILTERQ: + id = ModelDestination.DESTINATION_FILTER_Q; + break; + case SF2Region.GENERATOR_CHORUSEFFECTSSEND: + id = ModelDestination.DESTINATION_CHORUS; + break; + case SF2Region.GENERATOR_REVERBEFFECTSSEND: + id = ModelDestination.DESTINATION_REVERB; + break; + case SF2Region.GENERATOR_PAN: + id = ModelDestination.DESTINATION_PAN; + break; + case SF2Region.GENERATOR_DELAYMODLFO: + id = ModelDestination.DESTINATION_LFO1_DELAY; + break; + case SF2Region.GENERATOR_FREQMODLFO: + id = ModelDestination.DESTINATION_LFO1_FREQ; + break; + case SF2Region.GENERATOR_DELAYVIBLFO: + id = ModelDestination.DESTINATION_LFO2_DELAY; + break; + case SF2Region.GENERATOR_FREQVIBLFO: + id = ModelDestination.DESTINATION_LFO2_FREQ; + break; + + case SF2Region.GENERATOR_DELAYMODENV: + id = ModelDestination.DESTINATION_EG2_DELAY; + break; + case SF2Region.GENERATOR_ATTACKMODENV: + id = ModelDestination.DESTINATION_EG2_ATTACK; + break; + case SF2Region.GENERATOR_HOLDMODENV: + id = ModelDestination.DESTINATION_EG2_HOLD; + break; + case SF2Region.GENERATOR_DECAYMODENV: + id = ModelDestination.DESTINATION_EG2_DECAY; + break; + case SF2Region.GENERATOR_SUSTAINMODENV: + id = ModelDestination.DESTINATION_EG2_SUSTAIN; + amountcorrection[0] = -1; + break; + case SF2Region.GENERATOR_RELEASEMODENV: + id = ModelDestination.DESTINATION_EG2_RELEASE; + break; + case SF2Region.GENERATOR_DELAYVOLENV: + id = ModelDestination.DESTINATION_EG1_DELAY; + break; + case SF2Region.GENERATOR_ATTACKVOLENV: + id = ModelDestination.DESTINATION_EG1_ATTACK; + break; + case SF2Region.GENERATOR_HOLDVOLENV: + id = ModelDestination.DESTINATION_EG1_HOLD; + break; + case SF2Region.GENERATOR_DECAYVOLENV: + id = ModelDestination.DESTINATION_EG1_DECAY; + break; + case SF2Region.GENERATOR_SUSTAINVOLENV: + id = ModelDestination.DESTINATION_EG1_SUSTAIN; + amountcorrection[0] = -1; + break; + case SF2Region.GENERATOR_RELEASEVOLENV: + id = ModelDestination.DESTINATION_EG1_RELEASE; + break; + case SF2Region.GENERATOR_KEYNUM: + id = ModelDestination.DESTINATION_KEYNUMBER; + break; + case SF2Region.GENERATOR_VELOCITY: + id = ModelDestination.DESTINATION_VELOCITY; + break; + + case SF2Region.GENERATOR_COARSETUNE: + amountcorrection[0] = 100; + id = ModelDestination.DESTINATION_PITCH; + break; + + case SF2Region.GENERATOR_FINETUNE: + id = ModelDestination.DESTINATION_PITCH; + break; + + case SF2Region.GENERATOR_INITIALATTENUATION: + id = ModelDestination.DESTINATION_GAIN; + amountcorrection[0] = -0.376287f; + break; + + case SF2Region.GENERATOR_VIBLFOTOPITCH: + id = ModelDestination.DESTINATION_PITCH; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODLFOTOPITCH: + id = ModelDestination.DESTINATION_PITCH; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODLFOTOFILTERFC: + id = ModelDestination.DESTINATION_FILTER_FREQ; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODLFOTOVOLUME: + id = ModelDestination.DESTINATION_GAIN; + amountcorrection[0] = -0.376287f; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODENVTOPITCH: + id = ModelDestination.DESTINATION_PITCH; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_EG2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODENVTOFILTERFC: + id = ModelDestination.DESTINATION_FILTER_FREQ; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_EG2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + default: + break; + } + if (id != null) + return new ModelDestination(id); + return null; + } + + private void addTimecentValue(ModelPerformer performer, + ModelIdentifier dest, short value) { + double fvalue; + if (value == -12000) + fvalue = Double.NEGATIVE_INFINITY; + else + fvalue = value; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(fvalue, new ModelDestination(dest))); + } + + private void addValue(ModelPerformer performer, + ModelIdentifier dest, short value) { + double fvalue = value; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(fvalue, new ModelDestination(dest))); + } + + private void addValue(ModelPerformer performer, + ModelIdentifier dest, double value) { + double fvalue = value; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(fvalue, new ModelDestination(dest))); + } + + private short getGeneratorValue(Map generators, int gen) { + if (generators.containsKey(gen)) + return generators.get(gen); + return SF2Region.getDefaultValue(gen); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2InstrumentRegion.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2InstrumentRegion.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont instrument region. + * + * @author Karl Helgason + */ +public class SF2InstrumentRegion extends SF2Region { + + protected SF2Layer layer; + + public SF2Layer getLayer() { + return layer; + } + + public void setLayer(SF2Layer layer) { + this.layer = layer; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2Layer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Layer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +import javax.sound.midi.SoundbankResource; + +/** + * Soundfont layer. + * + * @author Karl Helgason + */ +public class SF2Layer extends SoundbankResource { + + protected String name = ""; + protected SF2GlobalRegion globalregion = null; + protected List regions = new ArrayList(); + + public SF2Layer(SF2Soundbank soundBank) { + super(soundBank, null, null); + } + + public SF2Layer() { + super(null, null, null); + } + + public Object getData() { + return null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getRegions() { + return regions; + } + + public SF2GlobalRegion getGlobalRegion() { + return globalregion; + } + + public void setGlobalZone(SF2GlobalRegion zone) { + globalregion = zone; + } + + public String toString() { + return "Layer: " + name; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2LayerRegion.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2LayerRegion.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont layer region. + * + * @author Karl Helgason + */ +public class SF2LayerRegion extends SF2Region { + + protected SF2Sample sample; + + public SF2Sample getSample() { + return sample; + } + + public void setSample(SF2Sample sample) { + this.sample = sample; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2Modulator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Modulator.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont modulator container. + * + * @author Karl Helgason + */ +public class SF2Modulator { + + public final static int SOURCE_NONE = 0; + public final static int SOURCE_NOTE_ON_VELOCITY = 2; + public final static int SOURCE_NOTE_ON_KEYNUMBER = 3; + public final static int SOURCE_POLY_PRESSURE = 10; + public final static int SOURCE_CHANNEL_PRESSURE = 13; + public final static int SOURCE_PITCH_WHEEL = 14; + public final static int SOURCE_PITCH_SENSITIVITY = 16; + public final static int SOURCE_MIDI_CONTROL = 128 * 1; + public final static int SOURCE_DIRECTION_MIN_MAX = 256 * 0; + public final static int SOURCE_DIRECTION_MAX_MIN = 256 * 1; + public final static int SOURCE_POLARITY_UNIPOLAR = 512 * 0; + public final static int SOURCE_POLARITY_BIPOLAR = 512 * 1; + public final static int SOURCE_TYPE_LINEAR = 1024 * 0; + public final static int SOURCE_TYPE_CONCAVE = 1024 * 1; + public final static int SOURCE_TYPE_CONVEX = 1024 * 2; + public final static int SOURCE_TYPE_SWITCH = 1024 * 3; + public final static int TRANSFORM_LINEAR = 0; + public final static int TRANSFORM_ABSOLUTE = 2; + protected int sourceOperator; + protected int destinationOperator; + protected short amount; + protected int amountSourceOperator; + protected int transportOperator; + + public short getAmount() { + return amount; + } + + public void setAmount(short amount) { + this.amount = amount; + } + + public int getAmountSourceOperator() { + return amountSourceOperator; + } + + public void setAmountSourceOperator(int amountSourceOperator) { + this.amountSourceOperator = amountSourceOperator; + } + + public int getTransportOperator() { + return transportOperator; + } + + public void setTransportOperator(int transportOperator) { + this.transportOperator = transportOperator; + } + + public int getDestinationOperator() { + return destinationOperator; + } + + public void setDestinationOperator(int destinationOperator) { + this.destinationOperator = destinationOperator; + } + + public int getSourceOperator() { + return sourceOperator; + } + + public void setSourceOperator(int sourceOperator) { + this.sourceOperator = sourceOperator; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2Region.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Region.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,167 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Soundfont general region. + * + * @author Karl Helgason + */ +public class SF2Region { + + public final static int GENERATOR_STARTADDRSOFFSET = 0; + public final static int GENERATOR_ENDADDRSOFFSET = 1; + public final static int GENERATOR_STARTLOOPADDRSOFFSET = 2; + public final static int GENERATOR_ENDLOOPADDRSOFFSET = 3; + public final static int GENERATOR_STARTADDRSCOARSEOFFSET = 4; + public final static int GENERATOR_MODLFOTOPITCH = 5; + public final static int GENERATOR_VIBLFOTOPITCH = 6; + public final static int GENERATOR_MODENVTOPITCH = 7; + public final static int GENERATOR_INITIALFILTERFC = 8; + public final static int GENERATOR_INITIALFILTERQ = 9; + public final static int GENERATOR_MODLFOTOFILTERFC = 10; + public final static int GENERATOR_MODENVTOFILTERFC = 11; + public final static int GENERATOR_ENDADDRSCOARSEOFFSET = 12; + public final static int GENERATOR_MODLFOTOVOLUME = 13; + public final static int GENERATOR_UNUSED1 = 14; + public final static int GENERATOR_CHORUSEFFECTSSEND = 15; + public final static int GENERATOR_REVERBEFFECTSSEND = 16; + public final static int GENERATOR_PAN = 17; + public final static int GENERATOR_UNUSED2 = 18; + public final static int GENERATOR_UNUSED3 = 19; + public final static int GENERATOR_UNUSED4 = 20; + public final static int GENERATOR_DELAYMODLFO = 21; + public final static int GENERATOR_FREQMODLFO = 22; + public final static int GENERATOR_DELAYVIBLFO = 23; + public final static int GENERATOR_FREQVIBLFO = 24; + public final static int GENERATOR_DELAYMODENV = 25; + public final static int GENERATOR_ATTACKMODENV = 26; + public final static int GENERATOR_HOLDMODENV = 27; + public final static int GENERATOR_DECAYMODENV = 28; + public final static int GENERATOR_SUSTAINMODENV = 29; + public final static int GENERATOR_RELEASEMODENV = 30; + public final static int GENERATOR_KEYNUMTOMODENVHOLD = 31; + public final static int GENERATOR_KEYNUMTOMODENVDECAY = 32; + public final static int GENERATOR_DELAYVOLENV = 33; + public final static int GENERATOR_ATTACKVOLENV = 34; + public final static int GENERATOR_HOLDVOLENV = 35; + public final static int GENERATOR_DECAYVOLENV = 36; + public final static int GENERATOR_SUSTAINVOLENV = 37; + public final static int GENERATOR_RELEASEVOLENV = 38; + public final static int GENERATOR_KEYNUMTOVOLENVHOLD = 39; + public final static int GENERATOR_KEYNUMTOVOLENVDECAY = 40; + public final static int GENERATOR_INSTRUMENT = 41; + public final static int GENERATOR_RESERVED1 = 42; + public final static int GENERATOR_KEYRANGE = 43; + public final static int GENERATOR_VELRANGE = 44; + public final static int GENERATOR_STARTLOOPADDRSCOARSEOFFSET = 45; + public final static int GENERATOR_KEYNUM = 46; + public final static int GENERATOR_VELOCITY = 47; + public final static int GENERATOR_INITIALATTENUATION = 48; + public final static int GENERATOR_RESERVED2 = 49; + public final static int GENERATOR_ENDLOOPADDRSCOARSEOFFSET = 50; + public final static int GENERATOR_COARSETUNE = 51; + public final static int GENERATOR_FINETUNE = 52; + public final static int GENERATOR_SAMPLEID = 53; + public final static int GENERATOR_SAMPLEMODES = 54; + public final static int GENERATOR_RESERVED3 = 55; + public final static int GENERATOR_SCALETUNING = 56; + public final static int GENERATOR_EXCLUSIVECLASS = 57; + public final static int GENERATOR_OVERRIDINGROOTKEY = 58; + public final static int GENERATOR_UNUSED5 = 59; + public final static int GENERATOR_ENDOPR = 60; + protected Map generators = new HashMap(); + protected List modulators = new ArrayList(); + + public Map getGenerators() { + return generators; + } + + public boolean contains(int generator) { + return generators.containsKey(generator); + } + + static public short getDefaultValue(int generator) { + if (generator == 8) return (short)13500; + if (generator == 21) return (short)-12000; + if (generator == 23) return (short)-12000; + if (generator == 25) return (short)-12000; + if (generator == 26) return (short)-12000; + if (generator == 27) return (short)-12000; + if (generator == 28) return (short)-12000; + if (generator == 30) return (short)-12000; + if (generator == 33) return (short)-12000; + if (generator == 34) return (short)-12000; + if (generator == 35) return (short)-12000; + if (generator == 36) return (short)-12000; + if (generator == 38) return (short)-12000; + if (generator == 43) return (short)0x7F00; + if (generator == 44) return (short)0x7F00; + if (generator == 46) return (short)-1; + if (generator == 47) return (short)-1; + if (generator == 56) return (short)100; + if (generator == 58) return (short)-1; + return 0; + } + + public short getShort(int generator) { + if (!contains(generator)) + return getDefaultValue(generator); + return generators.get(generator); + } + + public void putShort(int generator, short value) { + generators.put(generator, value); + } + + public byte[] getBytes(int generator) { + int val = getInteger(generator); + byte[] bytes = new byte[2]; + bytes[0] = (byte) (0xFF & val); + bytes[1] = (byte) ((0xFF00 & val) >> 8); + return bytes; + } + + public void putBytes(int generator, byte[] bytes) { + generators.put(generator, (short) (bytes[0] + (bytes[1] << 8))); + } + + public int getInteger(int generator) { + return 0xFFFF & getShort(generator); + } + + public void putInteger(int generator, int value) { + generators.put(generator, (short) value); + } + + public List getModulators() { + return modulators; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2Sample.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Sample.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,216 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.InputStream; + +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +/** + * Soundfont sample storage. + * + * @author Karl Helgason + */ +public class SF2Sample extends SoundbankResource { + + protected String name = ""; + protected long startLoop = 0; + protected long endLoop = 0; + protected long sampleRate = 44100; + protected int originalPitch = 60; + protected byte pitchCorrection = 0; + protected int sampleLink = 0; + protected int sampleType = 0; + protected ModelByteBuffer data; + protected ModelByteBuffer data24; + + public SF2Sample(Soundbank soundBank) { + super(soundBank, null, AudioInputStream.class); + } + + public SF2Sample() { + super(null, null, AudioInputStream.class); + } + + public Object getData() { + + AudioFormat format = getFormat(); + /* + if (sampleFile != null) { + FileInputStream fis; + try { + fis = new FileInputStream(sampleFile); + RIFFReader riff = new RIFFReader(fis); + if (!riff.getFormat().equals("RIFF")) { + throw new RIFFInvalidDataException( + "Input stream is not a valid RIFF stream!"); + } + if (!riff.getType().equals("sfbk")) { + throw new RIFFInvalidDataException( + "Input stream is not a valid SoundFont!"); + } + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("sdta")) { + while(chunk.hasNextChunk()) { + RIFFReader chunkchunk = chunk.nextChunk(); + if(chunkchunk.getFormat().equals("smpl")) { + chunkchunk.skip(sampleOffset); + return new AudioInputStream(chunkchunk, + format, sampleLen); + } + } + } + } + } + return null; + } catch (Exception e) { + return new Throwable(e.toString()); + } + } + */ + InputStream is = data.getInputStream(); + if (is == null) + return null; + return new AudioInputStream(is, format, data.capacity()); + } + + public ModelByteBuffer getDataBuffer() { + return data; + } + + public ModelByteBuffer getData24Buffer() { + return data24; + } + + public AudioFormat getFormat() { + return new AudioFormat(sampleRate, 16, 1, true, false); + } + + public void setData(ModelByteBuffer data) { + this.data = data; + } + + public void setData(byte[] data) { + this.data = new ModelByteBuffer(data); + } + + public void setData(byte[] data, int offset, int length) { + this.data = new ModelByteBuffer(data, offset, length); + } + + public void setData24(ModelByteBuffer data24) { + this.data24 = data24; + } + + public void setData24(byte[] data24) { + this.data24 = new ModelByteBuffer(data24); + } + + public void setData24(byte[] data24, int offset, int length) { + this.data24 = new ModelByteBuffer(data24, offset, length); + } + + /* + public void setData(File file, int offset, int length) { + this.data = null; + this.sampleFile = file; + this.sampleOffset = offset; + this.sampleLen = length; + } + */ + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getEndLoop() { + return endLoop; + } + + public void setEndLoop(long endLoop) { + this.endLoop = endLoop; + } + + public int getOriginalPitch() { + return originalPitch; + } + + public void setOriginalPitch(int originalPitch) { + this.originalPitch = originalPitch; + } + + public byte getPitchCorrection() { + return pitchCorrection; + } + + public void setPitchCorrection(byte pitchCorrection) { + this.pitchCorrection = pitchCorrection; + } + + public int getSampleLink() { + return sampleLink; + } + + public void setSampleLink(int sampleLink) { + this.sampleLink = sampleLink; + } + + public long getSampleRate() { + return sampleRate; + } + + public void setSampleRate(long sampleRate) { + this.sampleRate = sampleRate; + } + + public int getSampleType() { + return sampleType; + } + + public void setSampleType(int sampleType) { + this.sampleType = sampleType; + } + + public long getStartLoop() { + return startLoop; + } + + public void setStartLoop(long startLoop) { + this.startLoop = startLoop; + } + + public String toString() { + return "Sample: " + name; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2Soundbank.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Soundbank.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,973 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; + +/** + * A SoundFont 2.04 soundbank reader. + * + * Based on SoundFont 2.04 specification from: + *

    http://developer.creative.com
    + * http://www.soundfont.com/ ; + * + * @author Karl Helgason + */ +public class SF2Soundbank implements Soundbank { + + // version of the Sound Font RIFF file + protected int major = 2; + protected int minor = 1; + // target Sound Engine + protected String targetEngine = "EMU8000"; + // Sound Font Bank Name + protected String name = "untitled"; + // Sound ROM Name + protected String romName = null; + // Sound ROM Version + protected int romVersionMajor = -1; + protected int romVersionMinor = -1; + // Date of Creation of the Bank + protected String creationDate = null; + // Sound Designers and Engineers for the Bank + protected String engineers = null; + // Product for which the Bank was intended + protected String product = null; + // Copyright message + protected String copyright = null; + // Comments + protected String comments = null; + // The SoundFont tools used to create and alter the bank + protected String tools = null; + // The Sample Data loaded from the SoundFont + private ModelByteBuffer sampleData = null; + private ModelByteBuffer sampleData24 = null; + private File sampleFile = null; + private boolean largeFormat = false; + private List instruments = new ArrayList(); + private List layers = new ArrayList(); + private List samples = new ArrayList(); + + public SF2Soundbank() { + } + + public SF2Soundbank(URL url) throws IOException { + + InputStream is = url.openStream(); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public SF2Soundbank(File file) throws IOException { + largeFormat = true; + sampleFile = file; + InputStream is = new FileInputStream(file); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public SF2Soundbank(InputStream inputstream) throws IOException { + readSoundbank(inputstream); + } + + private void readSoundbank(InputStream inputstream) throws IOException { + RIFFReader riff = new RIFFReader(inputstream); + if (!riff.getFormat().equals("RIFF")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid RIFF stream!"); + } + if (!riff.getType().equals("sfbk")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid SoundFont!"); + } + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("INFO")) + readInfoChunk(chunk); + if (chunk.getType().equals("sdta")) + readSdtaChunk(chunk); + if (chunk.getType().equals("pdta")) + readPdtaChunk(chunk); + } + } + } + + private void readInfoChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("ifil")) { + major = chunk.readUnsignedShort(); + minor = chunk.readUnsignedShort(); + } else if (format.equals("isng")) { + this.targetEngine = chunk.readString(chunk.available()); + } else if (format.equals("INAM")) { + this.name = chunk.readString(chunk.available()); + } else if (format.equals("irom")) { + this.romName = chunk.readString(chunk.available()); + } else if (format.equals("iver")) { + romVersionMajor = chunk.readUnsignedShort(); + romVersionMinor = chunk.readUnsignedShort(); + } else if (format.equals("ICRD")) { + this.creationDate = chunk.readString(chunk.available()); + } else if (format.equals("IENG")) { + this.engineers = chunk.readString(chunk.available()); + } else if (format.equals("IPRD")) { + this.product = chunk.readString(chunk.available()); + } else if (format.equals("ICOP")) { + this.copyright = chunk.readString(chunk.available()); + } else if (format.equals("ICMT")) { + this.comments = chunk.readString(chunk.available()); + } else if (format.equals("ISFT")) { + this.tools = chunk.readString(chunk.available()); + } + + } + } + + private void readSdtaChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("smpl")) { + if (!largeFormat) { + byte[] sampleData = new byte[chunk.available()]; + + int read = 0; + int avail = chunk.available(); + while (read != avail) { + if (avail - read > 65536) { + chunk.readFully(sampleData, read, 65536); + read += 65536; + } else { + chunk.readFully(sampleData, read, avail - read); + read = avail; + } + + } + this.sampleData = new ModelByteBuffer(sampleData); + //chunk.read(sampleData); + } else { + this.sampleData = new ModelByteBuffer(sampleFile, + chunk.getFilePointer(), chunk.available()); + } + } + if (chunk.getFormat().equals("sm24")) { + if (!largeFormat) { + byte[] sampleData24 = new byte[chunk.available()]; + //chunk.read(sampleData24); + + int read = 0; + int avail = chunk.available(); + while (read != avail) { + if (avail - read > 65536) { + chunk.readFully(sampleData24, read, 65536); + read += 65536; + } else { + chunk.readFully(sampleData24, read, avail - read); + read = avail; + } + + } + this.sampleData24 = new ModelByteBuffer(sampleData24); + } else { + this.sampleData24 = new ModelByteBuffer(sampleFile, + chunk.getFilePointer(), chunk.available()); + } + + } + } + } + + private void readPdtaChunk(RIFFReader riff) throws IOException { + + List presets = new ArrayList(); + List presets_bagNdx = new ArrayList(); + List presets_splits_gen + = new ArrayList(); + List presets_splits_mod + = new ArrayList(); + + List instruments = new ArrayList(); + List instruments_bagNdx = new ArrayList(); + List instruments_splits_gen + = new ArrayList(); + List instruments_splits_mod + = new ArrayList(); + + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("phdr")) { + // Preset Header / Instrument + if (chunk.available() % 38 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 38; + for (int i = 0; i < count; i++) { + SF2Instrument preset = new SF2Instrument(this); + preset.name = chunk.readString(20); + preset.preset = chunk.readUnsignedShort(); + preset.bank = chunk.readUnsignedShort(); + presets_bagNdx.add(chunk.readUnsignedShort()); + preset.library = chunk.readUnsignedInt(); + preset.genre = chunk.readUnsignedInt(); + preset.morphology = chunk.readUnsignedInt(); + presets.add(preset); + if (i != count - 1) + this.instruments.add(preset); + } + } else if (format.equals("pbag")) { + // Preset Zones / Instruments splits + if (chunk.available() % 4 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 4; + + // Skip first record + { + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (presets_splits_gen.size() < gencount) + presets_splits_gen.add(null); + while (presets_splits_mod.size() < modcount) + presets_splits_mod.add(null); + count--; + } + + int offset = presets_bagNdx.get(0); + // Offset should be 0 (but just case) + for (int i = 0; i < offset; i++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (presets_splits_gen.size() < gencount) + presets_splits_gen.add(null); + while (presets_splits_mod.size() < modcount) + presets_splits_mod.add(null); + count--; + } + + for (int i = 0; i < presets_bagNdx.size() - 1; i++) { + int zone_count = presets_bagNdx.get(i + 1) + - presets_bagNdx.get(i); + SF2Instrument preset = presets.get(i); + for (int ii = 0; ii < zone_count; ii++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + SF2InstrumentRegion split = new SF2InstrumentRegion(); + preset.regions.add(split); + while (presets_splits_gen.size() < gencount) + presets_splits_gen.add(split); + while (presets_splits_mod.size() < modcount) + presets_splits_mod.add(split); + count--; + } + } + } else if (format.equals("pmod")) { + // Preset Modulators / Split Modulators + for (int i = 0; i < presets_splits_mod.size(); i++) { + SF2Modulator modulator = new SF2Modulator(); + modulator.sourceOperator = chunk.readUnsignedShort(); + modulator.destinationOperator = chunk.readUnsignedShort(); + modulator.amount = chunk.readShort(); + modulator.amountSourceOperator = chunk.readUnsignedShort(); + modulator.transportOperator = chunk.readUnsignedShort(); + SF2InstrumentRegion split = presets_splits_mod.get(i); + if (split != null) + split.modulators.add(modulator); + } + } else if (format.equals("pgen")) { + // Preset Generators / Split Generators + for (int i = 0; i < presets_splits_gen.size(); i++) { + int operator = chunk.readUnsignedShort(); + short amount = chunk.readShort(); + SF2InstrumentRegion split = presets_splits_gen.get(i); + if (split != null) + split.generators.put(operator, amount); + } + } else if (format.equals("inst")) { + // Instrument Header / Layers + if (chunk.available() % 22 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 22; + for (int i = 0; i < count; i++) { + SF2Layer layer = new SF2Layer(this); + layer.name = chunk.readString(20); + instruments_bagNdx.add(chunk.readUnsignedShort()); + instruments.add(layer); + if (i != count - 1) + this.layers.add(layer); + } + } else if (format.equals("ibag")) { + // Instrument Zones / Layer splits + if (chunk.available() % 4 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 4; + + // Skip first record + { + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (instruments_splits_gen.size() < gencount) + instruments_splits_gen.add(null); + while (instruments_splits_mod.size() < modcount) + instruments_splits_mod.add(null); + count--; + } + + int offset = instruments_bagNdx.get(0); + // Offset should be 0 (but just case) + for (int i = 0; i < offset; i++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (instruments_splits_gen.size() < gencount) + instruments_splits_gen.add(null); + while (instruments_splits_mod.size() < modcount) + instruments_splits_mod.add(null); + count--; + } + + for (int i = 0; i < instruments_bagNdx.size() - 1; i++) { + int zone_count = instruments_bagNdx.get(i + 1) - instruments_bagNdx.get(i); + SF2Layer layer = layers.get(i); + for (int ii = 0; ii < zone_count; ii++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + SF2LayerRegion split = new SF2LayerRegion(); + layer.regions.add(split); + while (instruments_splits_gen.size() < gencount) + instruments_splits_gen.add(split); + while (instruments_splits_mod.size() < modcount) + instruments_splits_mod.add(split); + count--; + } + } + + } else if (format.equals("imod")) { + // Instrument Modulators / Split Modulators + for (int i = 0; i < instruments_splits_mod.size(); i++) { + SF2Modulator modulator = new SF2Modulator(); + modulator.sourceOperator = chunk.readUnsignedShort(); + modulator.destinationOperator = chunk.readUnsignedShort(); + modulator.amount = chunk.readShort(); + modulator.amountSourceOperator = chunk.readUnsignedShort(); + modulator.transportOperator = chunk.readUnsignedShort(); + SF2LayerRegion split = instruments_splits_gen.get(i); + if (split != null) + split.modulators.add(modulator); + } + } else if (format.equals("igen")) { + // Instrument Generators / Split Generators + for (int i = 0; i < instruments_splits_gen.size(); i++) { + int operator = chunk.readUnsignedShort(); + short amount = chunk.readShort(); + SF2LayerRegion split = instruments_splits_gen.get(i); + if (split != null) + split.generators.put(operator, amount); + } + } else if (format.equals("shdr")) { + // Sample Headers + if (chunk.available() % 46 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 46; + for (int i = 0; i < count; i++) { + SF2Sample sample = new SF2Sample(this); + sample.name = chunk.readString(20); + long start = chunk.readUnsignedInt(); + long end = chunk.readUnsignedInt(); + sample.data = sampleData.subbuffer(start * 2, end * 2, true); + if (sampleData24 != null) + sample.data24 = sampleData24.subbuffer(start, end, true); + /* + sample.data = new ModelByteBuffer(sampleData, (int)(start*2), + (int)((end - start)*2)); + if (sampleData24 != null) + sample.data24 = new ModelByteBuffer(sampleData24, + (int)start, (int)(end - start)); + */ + sample.startLoop = chunk.readUnsignedInt() - start; + sample.endLoop = chunk.readUnsignedInt() - start; + if (sample.startLoop < 0) + sample.startLoop = -1; + if (sample.endLoop < 0) + sample.endLoop = -1; + sample.sampleRate = chunk.readUnsignedInt(); + sample.originalPitch = chunk.readUnsignedByte(); + sample.pitchCorrection = chunk.readByte(); + sample.sampleLink = chunk.readUnsignedShort(); + sample.sampleType = chunk.readUnsignedShort(); + if (i != count - 1) + this.samples.add(sample); + } + } + } + + Iterator liter = this.layers.iterator(); + while (liter.hasNext()) { + SF2Layer layer = liter.next(); + Iterator siter = layer.regions.iterator(); + SF2Region globalsplit = null; + while (siter.hasNext()) { + SF2LayerRegion split = siter.next(); + if (split.generators.get(SF2LayerRegion.GENERATOR_SAMPLEID) != null) { + int sampleid = split.generators.get( + SF2LayerRegion.GENERATOR_SAMPLEID); + split.generators.remove(SF2LayerRegion.GENERATOR_SAMPLEID); + split.sample = samples.get(sampleid); + } else { + globalsplit = split; + } + } + if (globalsplit != null) { + layer.getRegions().remove(globalsplit); + SF2GlobalRegion gsplit = new SF2GlobalRegion(); + gsplit.generators = globalsplit.generators; + gsplit.modulators = globalsplit.modulators; + layer.setGlobalZone(gsplit); + } + } + + + Iterator iiter = this.instruments.iterator(); + while (iiter.hasNext()) { + SF2Instrument instrument = iiter.next(); + Iterator siter = instrument.regions.iterator(); + SF2Region globalsplit = null; + while (siter.hasNext()) { + SF2InstrumentRegion split = siter.next(); + if (split.generators.get(SF2LayerRegion.GENERATOR_INSTRUMENT) != null) { + int instrumentid = split.generators.get( + SF2InstrumentRegion.GENERATOR_INSTRUMENT); + split.generators.remove(SF2LayerRegion.GENERATOR_INSTRUMENT); + split.layer = layers.get(instrumentid); + } else { + globalsplit = split; + } + } + + if (globalsplit != null) { + instrument.getRegions().remove(globalsplit); + SF2GlobalRegion gsplit = new SF2GlobalRegion(); + gsplit.generators = globalsplit.generators; + gsplit.modulators = globalsplit.modulators; + instrument.setGlobalZone(gsplit); + } + } + + } + + public void save(String name) throws IOException { + writeSoundbank(new RIFFWriter(name, "sfbk")); + } + + public void save(File file) throws IOException { + writeSoundbank(new RIFFWriter(file, "sfbk")); + } + + public void save(OutputStream out) throws IOException { + writeSoundbank(new RIFFWriter(out, "sfbk")); + } + + private void writeSoundbank(RIFFWriter writer) throws IOException { + writeInfo(writer.writeList("INFO")); + writeSdtaChunk(writer.writeList("sdta")); + writePdtaChunk(writer.writeList("pdta")); + writer.close(); + } + + private void writeInfoStringChunk(RIFFWriter writer, String name, + String value) throws IOException { + if (value == null) + return; + RIFFWriter chunk = writer.writeChunk(name); + chunk.writeString(value); + int len = value.getBytes("ascii").length; + chunk.write(0); + len++; + if (len % 2 != 0) + chunk.write(0); + } + + private void writeInfo(RIFFWriter writer) throws IOException { + if (this.targetEngine == null) + this.targetEngine = "EMU8000"; + if (this.name == null) + this.name = ""; + + RIFFWriter ifil_chunk = writer.writeChunk("ifil"); + ifil_chunk.writeUnsignedShort(this.major); + ifil_chunk.writeUnsignedShort(this.minor); + writeInfoStringChunk(writer, "isng", this.targetEngine); + writeInfoStringChunk(writer, "INAM", this.name); + writeInfoStringChunk(writer, "irom", this.romName); + if (romVersionMajor != -1) { + RIFFWriter iver_chunk = writer.writeChunk("iver"); + iver_chunk.writeUnsignedShort(this.romVersionMajor); + iver_chunk.writeUnsignedShort(this.romVersionMinor); + } + writeInfoStringChunk(writer, "ICRD", this.creationDate); + writeInfoStringChunk(writer, "IENG", this.engineers); + writeInfoStringChunk(writer, "IPRD", this.product); + writeInfoStringChunk(writer, "ICOP", this.copyright); + writeInfoStringChunk(writer, "ICMT", this.comments); + writeInfoStringChunk(writer, "ISFT", this.tools); + + writer.close(); + } + + private void writeSdtaChunk(RIFFWriter writer) throws IOException { + + byte[] pad = new byte[32]; + + RIFFWriter smpl_chunk = writer.writeChunk("smpl"); + for (SF2Sample sample : samples) { + ModelByteBuffer data = sample.getDataBuffer(); + data.writeTo(smpl_chunk); + /* + smpl_chunk.write(data.array(), + data.arrayOffset(), + data.capacity()); + */ + smpl_chunk.write(pad); + smpl_chunk.write(pad); + } + if (major < 2) + return; + if (major == 2 && minor < 4) + return; + + + for (SF2Sample sample : samples) { + ModelByteBuffer data24 = sample.getData24Buffer(); + if (data24 == null) + return; + } + + RIFFWriter sm24_chunk = writer.writeChunk("sm24"); + for (SF2Sample sample : samples) { + ModelByteBuffer data = sample.getData24Buffer(); + data.writeTo(sm24_chunk); + /* + sm24_chunk.write(data.array(), + data.arrayOffset(), + data.capacity());*/ + smpl_chunk.write(pad); + } + } + + private void writeModulators(RIFFWriter writer, List modulators) + throws IOException { + for (SF2Modulator modulator : modulators) { + writer.writeUnsignedShort(modulator.sourceOperator); + writer.writeUnsignedShort(modulator.destinationOperator); + writer.writeShort(modulator.amount); + writer.writeUnsignedShort(modulator.amountSourceOperator); + writer.writeUnsignedShort(modulator.transportOperator); + } + } + + private void writeGenerators(RIFFWriter writer, Map generators) + throws IOException { + Short keyrange = (Short) generators.get(SF2Region.GENERATOR_KEYRANGE); + Short velrange = (Short) generators.get(SF2Region.GENERATOR_VELRANGE); + if (keyrange != null) { + writer.writeUnsignedShort(SF2Region.GENERATOR_KEYRANGE); + writer.writeShort(keyrange); + } + if (velrange != null) { + writer.writeUnsignedShort(SF2Region.GENERATOR_VELRANGE); + writer.writeShort(velrange); + } + for (Map.Entry generator : generators.entrySet()) { + if (generator.getKey() == SF2Region.GENERATOR_KEYRANGE) + continue; + if (generator.getKey() == SF2Region.GENERATOR_VELRANGE) + continue; + writer.writeUnsignedShort(generator.getKey()); + writer.writeShort(generator.getValue()); + } + } + + private void writePdtaChunk(RIFFWriter writer) throws IOException { + + RIFFWriter phdr_chunk = writer.writeChunk("phdr"); + int phdr_zone_count = 0; + for (SF2Instrument preset : this.instruments) { + phdr_chunk.writeString(preset.name, 20); + phdr_chunk.writeUnsignedShort(preset.preset); + phdr_chunk.writeUnsignedShort(preset.bank); + phdr_chunk.writeUnsignedShort(phdr_zone_count); + if (preset.getGlobalRegion() != null) + phdr_zone_count += 1; + phdr_zone_count += preset.getRegions().size(); + phdr_chunk.writeUnsignedInt(preset.library); + phdr_chunk.writeUnsignedInt(preset.genre); + phdr_chunk.writeUnsignedInt(preset.morphology); + } + phdr_chunk.writeString("EOP", 20); + phdr_chunk.writeUnsignedShort(0); + phdr_chunk.writeUnsignedShort(0); + phdr_chunk.writeUnsignedShort(phdr_zone_count); + phdr_chunk.writeUnsignedInt(0); + phdr_chunk.writeUnsignedInt(0); + phdr_chunk.writeUnsignedInt(0); + + + RIFFWriter pbag_chunk = writer.writeChunk("pbag"); + int pbag_gencount = 0; + int pbag_modcount = 0; + for (SF2Instrument preset : this.instruments) { + if (preset.getGlobalRegion() != null) { + pbag_chunk.writeUnsignedShort(pbag_gencount); + pbag_chunk.writeUnsignedShort(pbag_modcount); + pbag_gencount += preset.getGlobalRegion().getGenerators().size(); + pbag_modcount += preset.getGlobalRegion().getModulators().size(); + } + for (SF2InstrumentRegion region : preset.getRegions()) { + pbag_chunk.writeUnsignedShort(pbag_gencount); + pbag_chunk.writeUnsignedShort(pbag_modcount); + if (layers.indexOf(region.layer) != -1) { + // One generator is used to reference to instrument record + pbag_gencount += 1; + } + pbag_gencount += region.getGenerators().size(); + pbag_modcount += region.getModulators().size(); + + } + } + pbag_chunk.writeUnsignedShort(pbag_gencount); + pbag_chunk.writeUnsignedShort(pbag_modcount); + + RIFFWriter pmod_chunk = writer.writeChunk("pmod"); + for (SF2Instrument preset : this.instruments) { + if (preset.getGlobalRegion() != null) { + writeModulators(pmod_chunk, + preset.getGlobalRegion().getModulators()); + } + for (SF2InstrumentRegion region : preset.getRegions()) + writeModulators(pmod_chunk, region.getModulators()); + } + pmod_chunk.write(new byte[10]); + + RIFFWriter pgen_chunk = writer.writeChunk("pgen"); + for (SF2Instrument preset : this.instruments) { + if (preset.getGlobalRegion() != null) { + writeGenerators(pgen_chunk, + preset.getGlobalRegion().getGenerators()); + } + for (SF2InstrumentRegion region : preset.getRegions()) { + writeGenerators(pgen_chunk, region.getGenerators()); + int ix = (int) layers.indexOf(region.layer); + if (ix != -1) { + pgen_chunk.writeUnsignedShort(SF2Region.GENERATOR_INSTRUMENT); + pgen_chunk.writeShort((short) ix); + } + } + } + pgen_chunk.write(new byte[4]); + + RIFFWriter inst_chunk = writer.writeChunk("inst"); + int inst_zone_count = 0; + for (SF2Layer instrument : this.layers) { + inst_chunk.writeString(instrument.name, 20); + inst_chunk.writeUnsignedShort(inst_zone_count); + if (instrument.getGlobalRegion() != null) + inst_zone_count += 1; + inst_zone_count += instrument.getRegions().size(); + } + inst_chunk.writeString("EOI", 20); + inst_chunk.writeUnsignedShort(inst_zone_count); + + + RIFFWriter ibag_chunk = writer.writeChunk("ibag"); + int ibag_gencount = 0; + int ibag_modcount = 0; + for (SF2Layer instrument : this.layers) { + if (instrument.getGlobalRegion() != null) { + ibag_chunk.writeUnsignedShort(ibag_gencount); + ibag_chunk.writeUnsignedShort(ibag_modcount); + ibag_gencount + += instrument.getGlobalRegion().getGenerators().size(); + ibag_modcount + += instrument.getGlobalRegion().getModulators().size(); + } + for (SF2LayerRegion region : instrument.getRegions()) { + ibag_chunk.writeUnsignedShort(ibag_gencount); + ibag_chunk.writeUnsignedShort(ibag_modcount); + if (samples.indexOf(region.sample) != -1) { + // One generator is used to reference to instrument record + ibag_gencount += 1; + } + ibag_gencount += region.getGenerators().size(); + ibag_modcount += region.getModulators().size(); + + } + } + ibag_chunk.writeUnsignedShort(ibag_gencount); + ibag_chunk.writeUnsignedShort(ibag_modcount); + + + RIFFWriter imod_chunk = writer.writeChunk("imod"); + for (SF2Layer instrument : this.layers) { + if (instrument.getGlobalRegion() != null) { + writeModulators(imod_chunk, + instrument.getGlobalRegion().getModulators()); + } + for (SF2LayerRegion region : instrument.getRegions()) + writeModulators(imod_chunk, region.getModulators()); + } + imod_chunk.write(new byte[10]); + + RIFFWriter igen_chunk = writer.writeChunk("igen"); + for (SF2Layer instrument : this.layers) { + if (instrument.getGlobalRegion() != null) { + writeGenerators(igen_chunk, + instrument.getGlobalRegion().getGenerators()); + } + for (SF2LayerRegion region : instrument.getRegions()) { + writeGenerators(igen_chunk, region.getGenerators()); + int ix = samples.indexOf(region.sample); + if (ix != -1) { + igen_chunk.writeUnsignedShort(SF2Region.GENERATOR_SAMPLEID); + igen_chunk.writeShort((short) ix); + } + } + } + igen_chunk.write(new byte[4]); + + + RIFFWriter shdr_chunk = writer.writeChunk("shdr"); + long sample_pos = 0; + for (SF2Sample sample : samples) { + shdr_chunk.writeString(sample.name, 20); + long start = sample_pos; + sample_pos += sample.data.capacity() / 2; + long end = sample_pos; + long startLoop = sample.startLoop + start; + long endLoop = sample.endLoop + start; + if (startLoop < start) + startLoop = start; + if (endLoop > end) + endLoop = end; + shdr_chunk.writeUnsignedInt(start); + shdr_chunk.writeUnsignedInt(end); + shdr_chunk.writeUnsignedInt(startLoop); + shdr_chunk.writeUnsignedInt(endLoop); + shdr_chunk.writeUnsignedInt(sample.sampleRate); + shdr_chunk.writeUnsignedByte(sample.originalPitch); + shdr_chunk.writeByte(sample.pitchCorrection); + shdr_chunk.writeUnsignedShort(sample.sampleLink); + shdr_chunk.writeUnsignedShort(sample.sampleType); + sample_pos += 32; + } + shdr_chunk.writeString("EOS", 20); + shdr_chunk.write(new byte[26]); + + } + + public String getName() { + return name; + } + + public String getVersion() { + return major + "." + minor; + } + + public String getVendor() { + return engineers; + } + + public String getDescription() { + return comments; + } + + public void setName(String s) { + name = s; + } + + public void setVendor(String s) { + engineers = s; + } + + public void setDescription(String s) { + comments = s; + } + + public SoundbankResource[] getResources() { + SoundbankResource[] resources + = new SoundbankResource[layers.size() + samples.size()]; + int j = 0; + for (int i = 0; i < layers.size(); i++) + resources[j++] = layers.get(i); + for (int i = 0; i < samples.size(); i++) + resources[j++] = samples.get(i); + return resources; + } + + public SF2Instrument[] getInstruments() { + SF2Instrument[] inslist_array + = instruments.toArray(new SF2Instrument[instruments.size()]); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + + public SF2Layer[] getLayers() { + return layers.toArray(new SF2Layer[layers.size()]); + } + + public SF2Sample[] getSamples() { + return samples.toArray(new SF2Sample[samples.size()]); + } + + public Instrument getInstrument(Patch patch) { + int program = patch.getProgram(); + int bank = patch.getBank(); + boolean percussion = false; + if (patch instanceof ModelPatch) + percussion = ((ModelPatch)patch).isPercussion(); + for (Instrument instrument : instruments) { + Patch patch2 = instrument.getPatch(); + int program2 = patch2.getProgram(); + int bank2 = patch2.getBank(); + if (program == program2 && bank == bank2) { + boolean percussion2 = false; + if (patch2 instanceof ModelPatch) + percussion2 = ((ModelPatch) patch2).isPercussion(); + if (percussion == percussion2) + return instrument; + } + } + return null; + } + + public String getCreationDate() { + return creationDate; + } + + public void setCreationDate(String creationDate) { + this.creationDate = creationDate; + } + + public String getProduct() { + return product; + } + + public void setProduct(String product) { + this.product = product; + } + + public String getRomName() { + return romName; + } + + public void setRomName(String romName) { + this.romName = romName; + } + + public int getRomVersionMajor() { + return romVersionMajor; + } + + public void setRomVersionMajor(int romVersionMajor) { + this.romVersionMajor = romVersionMajor; + } + + public int getRomVersionMinor() { + return romVersionMinor; + } + + public void setRomVersionMinor(int romVersionMinor) { + this.romVersionMinor = romVersionMinor; + } + + public String getTargetEngine() { + return targetEngine; + } + + public void setTargetEngine(String targetEngine) { + this.targetEngine = targetEngine; + } + + public String getTools() { + return tools; + } + + public void setTools(String tools) { + this.tools = tools; + } + + public void addResource(SoundbankResource resource) { + if (resource instanceof SF2Instrument) + instruments.add((SF2Instrument)resource); + if (resource instanceof SF2Layer) + layers.add((SF2Layer)resource); + if (resource instanceof SF2Sample) + samples.add((SF2Sample)resource); + } + + public void removeResource(SoundbankResource resource) { + if (resource instanceof SF2Instrument) + instruments.remove((SF2Instrument)resource); + if (resource instanceof SF2Layer) + layers.remove((SF2Layer)resource); + if (resource instanceof SF2Sample) + samples.remove((SF2Sample)resource); + } + + public void addInstrument(SF2Instrument resource) { + instruments.add(resource); + } + + public void removeInstrument(SF2Instrument resource) { + instruments.remove(resource); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SF2SoundbankReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SF2SoundbankReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; + +/** + * This class is used to connect the SF2SoundBank class + * to the SoundbankReader SPI interface. + * + * @author Karl Helgason + */ +public class SF2SoundbankReader extends SoundbankReader { + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + try { + return new SF2Soundbank(url); + } catch (RIFFInvalidFormatException e) { + return null; + } catch(IOException ioe) { + return null; + } + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + try { + stream.mark(512); + return new SF2Soundbank(stream); + } catch (RIFFInvalidFormatException e) { + stream.reset(); + return null; + } + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + try { + return new SF2Soundbank(file); + } catch (RIFFInvalidFormatException e) { + return null; + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SimpleInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SimpleInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,196 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; +import javax.sound.midi.Patch; + +/** + * A simple instrument that is made of other ModelInstrument, ModelPerformer + * objects. + * + * @author Karl Helgason + */ +public class SimpleInstrument extends ModelInstrument { + + private static class SimpleInstrumentPart { + ModelPerformer[] performers; + int keyFrom; + int keyTo; + int velFrom; + int velTo; + int exclusiveClass; + } + protected int preset = 0; + protected int bank = 0; + protected boolean percussion = false; + protected String name = ""; + protected List parts + = new ArrayList(); + + public SimpleInstrument() { + super(null, null, null, null); + } + + public void clear() { + parts.clear(); + } + + public void add(ModelPerformer[] performers, int keyFrom, int keyTo, + int velFrom, int velTo, int exclusiveClass) { + SimpleInstrumentPart part = new SimpleInstrumentPart(); + part.performers = performers; + part.keyFrom = keyFrom; + part.keyTo = keyTo; + part.velFrom = velFrom; + part.velTo = velTo; + part.exclusiveClass = exclusiveClass; + parts.add(part); + } + + public void add(ModelPerformer[] performers, int keyFrom, int keyTo, + int velFrom, int velTo) { + add(performers, keyFrom, keyTo, velFrom, velTo, -1); + } + + public void add(ModelPerformer[] performers, int keyFrom, int keyTo) { + add(performers, keyFrom, keyTo, 0, 127, -1); + } + + public void add(ModelPerformer[] performers) { + add(performers, 0, 127, 0, 127, -1); + } + + public void add(ModelPerformer performer, int keyFrom, int keyTo, + int velFrom, int velTo, int exclusiveClass) { + add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo, + exclusiveClass); + } + + public void add(ModelPerformer performer, int keyFrom, int keyTo, + int velFrom, int velTo) { + add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo); + } + + public void add(ModelPerformer performer, int keyFrom, int keyTo) { + add(new ModelPerformer[]{performer}, keyFrom, keyTo); + } + + public void add(ModelPerformer performer) { + add(new ModelPerformer[]{performer}); + } + + public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, + int velTo, int exclusiveClass) { + add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo, exclusiveClass); + } + + public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, + int velTo) { + add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo); + } + + public void add(ModelInstrument ins, int keyFrom, int keyTo) { + add(ins.getPerformers(), keyFrom, keyTo); + } + + public void add(ModelInstrument ins) { + add(ins.getPerformers()); + } + + public ModelPerformer[] getPerformers() { + + int percount = 0; + for (SimpleInstrumentPart part : parts) + if (part.performers != null) + percount += part.performers.length; + + ModelPerformer[] performers = new ModelPerformer[percount]; + int px = 0; + for (SimpleInstrumentPart part : parts) { + if (part.performers != null) { + for (ModelPerformer mperfm : part.performers) { + ModelPerformer performer = new ModelPerformer(); + performer.setName(getName()); + performers[px++] = performer; + + performer.setDefaultConnectionsEnabled( + mperfm.isDefaultConnectionsEnabled()); + performer.setKeyFrom(mperfm.getKeyFrom()); + performer.setKeyTo(mperfm.getKeyTo()); + performer.setVelFrom(mperfm.getVelFrom()); + performer.setVelTo(mperfm.getVelTo()); + performer.setExclusiveClass(mperfm.getExclusiveClass()); + performer.setSelfNonExclusive(mperfm.isSelfNonExclusive()); + performer.setReleaseTriggered(mperfm.isReleaseTriggered()); + if (part.exclusiveClass != -1) + performer.setExclusiveClass(part.exclusiveClass); + if (part.keyFrom > performer.getKeyFrom()) + performer.setKeyFrom(part.keyFrom); + if (part.keyTo < performer.getKeyTo()) + performer.setKeyTo(part.keyTo); + if (part.velFrom > performer.getVelFrom()) + performer.setVelFrom(part.velFrom); + if (part.velTo < performer.getVelTo()) + performer.setVelTo(part.velTo); + performer.getOscillators().addAll(mperfm.getOscillators()); + performer.getConnectionBlocks().addAll( + mperfm.getConnectionBlocks()); + } + } + } + + return performers; + } + + public Object getData() { + return null; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public ModelPatch getPatch() { + return new ModelPatch(bank, preset, percussion); + } + + public void setPatch(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch)patch).isPercussion()) { + percussion = true; + bank = patch.getBank(); + preset = patch.getProgram(); + } else { + percussion = false; + bank = patch.getBank(); + preset = patch.getProgram(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SimpleSoundbank.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SimpleSoundbank.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,145 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; + +/** + * A simple soundbank that contains instruments and soundbankresources. + * + * @author Karl Helgason + */ +public class SimpleSoundbank implements Soundbank { + + String name = ""; + String version = ""; + String vendor = ""; + String description = ""; + List resources = new ArrayList(); + List instruments = new ArrayList(); + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + public String getVendor() { + return vendor; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setName(String name) { + this.name = name; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public void setVersion(String version) { + this.version = version; + } + + public SoundbankResource[] getResources() { + return resources.toArray(new SoundbankResource[resources.size()]); + } + + public Instrument[] getInstruments() { + Instrument[] inslist_array + = instruments.toArray(new Instrument[resources.size()]); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + + public Instrument getInstrument(Patch patch) { + int program = patch.getProgram(); + int bank = patch.getBank(); + boolean percussion = false; + if (patch instanceof ModelPatch) + percussion = ((ModelPatch)patch).isPercussion(); + for (Instrument instrument : instruments) { + Patch patch2 = instrument.getPatch(); + int program2 = patch2.getProgram(); + int bank2 = patch2.getBank(); + if (program == program2 && bank == bank2) { + boolean percussion2 = false; + if (patch2 instanceof ModelPatch) + percussion2 = ((ModelPatch)patch2).isPercussion(); + if (percussion == percussion2) + return instrument; + } + } + return null; + } + + public void addResource(SoundbankResource resource) { + if (resource instanceof Instrument) + instruments.add((Instrument) resource); + else + resources.add(resource); + } + + public void removeResource(SoundbankResource resource) { + if (resource instanceof Instrument) + instruments.remove((Instrument) resource); + else + resources.remove(resource); + } + + public void addInstrument(Instrument resource) { + instruments.add(resource); + } + + public void removeInstrument(Instrument resource) { + instruments.remove(resource); + } + + public void addAllInstruments(Soundbank soundbank) { + for (Instrument ins : soundbank.getInstruments()) + addInstrument(ins); + } + + public void removeAllInstruments(Soundbank soundbank) { + for (Instrument ins : soundbank.getInstruments()) + removeInstrument(ins); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftAbstractResampler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAbstractResampler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,390 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.Arrays; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.VoiceStatus; + +/** + * Abstract resampler class. + * + * @author Karl Helgason + */ +public abstract class SoftAbstractResampler implements SoftResampler { + + private class ModelAbstractResamplerStream implements SoftResamplerStreamer { + + AudioFloatInputStream stream; + boolean stream_eof = false; + int loopmode; + boolean loopdirection = true; // true = forward + float loopstart; + float looplen; + float target_pitch; + float[] current_pitch = new float[1]; + boolean started; + boolean eof; + int sector_pos = 0; + int sector_size = 400; + int sector_loopstart = -1; + boolean markset = false; + int marklimit = 0; + int streampos = 0; + int nrofchannels = 2; + boolean noteOff_flag = false; + float[][] ibuffer; + boolean ibuffer_order = true; + float[] sbuffer; + int pad; + int pad2; + float[] ix = new float[1]; + int[] ox = new int[1]; + float samplerateconv = 1; + float pitchcorrection = 0; + + public ModelAbstractResamplerStream() { + pad = getPadding(); + pad2 = getPadding() * 2; + ibuffer = new float[2][sector_size + pad2]; + ibuffer_order = true; + } + + public void noteOn(MidiChannel channel, VoiceStatus voice, + int noteNumber, int velocity) { + } + + public void noteOff(int velocity) { + noteOff_flag = true; + } + + public void open(ModelWavetable osc, float outputsamplerate) + throws IOException { + + eof = false; + nrofchannels = osc.getChannels(); + if (ibuffer.length < nrofchannels) { + ibuffer = new float[nrofchannels][sector_size + pad2]; + } + + stream = osc.openStream(); + streampos = 0; + stream_eof = false; + pitchcorrection = osc.getPitchcorrection(); + samplerateconv + = stream.getFormat().getSampleRate() / outputsamplerate; + looplen = osc.getLoopLength(); + loopstart = osc.getLoopStart(); + sector_loopstart = (int) (loopstart / sector_size); + sector_loopstart = sector_loopstart - 1; + + sector_pos = 0; + + if (sector_loopstart < 0) + sector_loopstart = 0; + started = false; + loopmode = osc.getLoopType(); + + if (loopmode != 0) { + markset = false; + marklimit = nrofchannels * (int) (looplen + pad2 + 1); + } else + markset = true; + // loopmode = 0; + + target_pitch = samplerateconv; + current_pitch[0] = samplerateconv; + + ibuffer_order = true; + loopdirection = true; + noteOff_flag = false; + + for (int i = 0; i < nrofchannels; i++) + Arrays.fill(ibuffer[i], sector_size, sector_size + pad2, 0); + ix[0] = pad; + eof = false; + + ix[0] = sector_size + pad; + sector_pos = -1; + streampos = -sector_size; + + nextBuffer(); + } + + public void setPitch(float pitch) { + /* + this.pitch = (float) Math.pow(2f, + (pitchcorrection + pitch) / 1200.0f) + * samplerateconv; + */ + this.target_pitch = (float)Math.exp( + (pitchcorrection + pitch) * (Math.log(2.0) / 1200.0)) + * samplerateconv; + + if (!started) + current_pitch[0] = this.target_pitch; + } + + public void nextBuffer() throws IOException { + if (ix[0] < pad) { + if (markset) { + // reset to target sector + stream.reset(); + ix[0] += streampos - (sector_loopstart * sector_size); + sector_pos = sector_loopstart; + streampos = sector_pos * sector_size; + + // and go one sector backward + ix[0] += sector_size; + sector_pos -= 1; + streampos -= sector_size; + stream_eof = false; + } + } + + if (ix[0] >= sector_size + pad) { + if (stream_eof) { + eof = true; + return; + } + } + + if (ix[0] >= sector_size * 4 + pad) { + int skips = (int)((ix[0] - sector_size * 4 + pad) / sector_size); + ix[0] -= sector_size * skips; + sector_pos += skips; + streampos += sector_size * skips; + stream.skip(sector_size * skips); + } + + while (ix[0] >= sector_size + pad) { + if (!markset) { + if (sector_pos + 1 == sector_loopstart) { + stream.mark(marklimit); + markset = true; + } + } + ix[0] -= sector_size; + sector_pos++; + streampos += sector_size; + + for (int c = 0; c < nrofchannels; c++) { + float[] cbuffer = ibuffer[c]; + for (int i = 0; i < pad2; i++) + cbuffer[i] = cbuffer[i + sector_size]; + } + + int ret; + if (nrofchannels == 1) + ret = stream.read(ibuffer[0], pad2, sector_size); + else { + int slen = sector_size * nrofchannels; + if (sbuffer == null || sbuffer.length < slen) + sbuffer = new float[slen]; + int sret = stream.read(sbuffer, 0, slen); + if (sret == -1) + ret = -1; + else { + ret = sret / nrofchannels; + for (int i = 0; i < nrofchannels; i++) { + float[] buff = ibuffer[i]; + int ix = i; + int ix_step = nrofchannels; + int ox = pad2; + for (int j = 0; j < ret; j++, ix += ix_step, ox++) + buff[ox] = sbuffer[ix]; + } + } + + } + + if (ret == -1) { + ret = 0; + stream_eof = true; + for (int i = 0; i < nrofchannels; i++) + Arrays.fill(ibuffer[i], pad2, pad2 + sector_size, 0f); + return; + } + if (ret != sector_size) { + for (int i = 0; i < nrofchannels; i++) + Arrays.fill(ibuffer[i], pad2 + ret, pad2 + sector_size, 0f); + } + + ibuffer_order = true; + + } + + } + + public void reverseBuffers() { + ibuffer_order = !ibuffer_order; + for (int c = 0; c < nrofchannels; c++) { + float[] cbuff = ibuffer[c]; + int len = cbuff.length - 1; + int len2 = cbuff.length / 2; + for (int i = 0; i < len2; i++) { + float x = cbuff[i]; + cbuff[i] = cbuff[len - i]; + cbuff[len - i] = x; + } + } + } + + public int read(float[][] buffer, int offset, int len) + throws IOException { + + if (eof) + return -1; + + if (noteOff_flag) + if ((loopmode & 2) != 0) + if (loopdirection) + loopmode = 0; + + + float pitchstep = (target_pitch - current_pitch[0]) / len; + float[] current_pitch = this.current_pitch; + started = true; + + int[] ox = this.ox; + ox[0] = offset; + int ox_end = len + offset; + + float ixend = sector_size + pad; + if (!loopdirection) + ixend = pad; + while (ox[0] != ox_end) { + nextBuffer(); + if (!loopdirection) { + // If we are in backward playing part of pingpong + // or reverse loop + + if (streampos < (loopstart + pad)) { + ixend = loopstart - streampos + pad2; + if (ix[0] <= ixend) { + if ((loopmode & 4) != 0) { + // Ping pong loop, change loopdirection + loopdirection = true; + ixend = sector_size + pad; + continue; + } + + ix[0] += looplen; + ixend = pad; + continue; + } + } + + if (ibuffer_order != loopdirection) + reverseBuffers(); + + ix[0] = (sector_size + pad2) - ix[0]; + ixend = (sector_size + pad2) - ixend; + ixend++; + + float bak_ix = ix[0]; + int bak_ox = ox[0]; + float bak_pitch = current_pitch[0]; + for (int i = 0; i < nrofchannels; i++) { + if (buffer[i] != null) { + ix[0] = bak_ix; + ox[0] = bak_ox; + current_pitch[0] = bak_pitch; + interpolate(ibuffer[i], ix, ixend, current_pitch, + pitchstep, buffer[i], ox, ox_end); + } + } + + ix[0] = (sector_size + pad2) - ix[0]; + ixend--; + ixend = (sector_size + pad2) - ixend; + + if (eof) { + current_pitch[0] = this.target_pitch; + return ox[0] - offset; + } + + continue; + } + if (loopmode != 0) { + if (streampos + sector_size > (looplen + loopstart + pad)) { + ixend = loopstart + looplen - streampos + pad2; + if (ix[0] >= ixend) { + if ((loopmode & 4) != 0 || (loopmode & 8) != 0) { + // Ping pong or revese loop, change loopdirection + loopdirection = false; + ixend = pad; + continue; + } + ixend = sector_size + pad; + ix[0] -= looplen; + continue; + } + } + } + + if (ibuffer_order != loopdirection) + reverseBuffers(); + + float bak_ix = ix[0]; + int bak_ox = ox[0]; + float bak_pitch = current_pitch[0]; + for (int i = 0; i < nrofchannels; i++) { + if (buffer[i] != null) { + ix[0] = bak_ix; + ox[0] = bak_ox; + current_pitch[0] = bak_pitch; + interpolate(ibuffer[i], ix, ixend, current_pitch, + pitchstep, buffer[i], ox, ox_end); + } + } + + if (eof) { + current_pitch[0] = this.target_pitch; + return ox[0] - offset; + } + } + + current_pitch[0] = this.target_pitch; + return len; + } + + public void close() throws IOException { + stream.close(); + } + } + + public abstract int getPadding(); + + public abstract void interpolate(float[] in, float[] in_offset, + float in_end, float[] pitch, float pitchstep, float[] out, + int[] out_offset, int out_end); + + public SoftResamplerStreamer openStreamer() { + return new ModelAbstractResamplerStream(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; + +/** + * This class is used to store audio buffer. + * + * @author Karl Helgason + */ +public class SoftAudioBuffer { + + private int size; + private float[] buffer; + private boolean empty = true; + private AudioFormat format; + private AudioFloatConverter converter; + private byte[] converter_buffer; + + public SoftAudioBuffer(int size, AudioFormat format) { + this.size = size; + this.format = format; + converter = AudioFloatConverter.getConverter(format); + } + + public AudioFormat getFormat() { + return format; + } + + public int getSize() { + return size; + } + + public void clear() { + if (!empty) { + Arrays.fill(buffer, 0); + empty = true; + } + } + + public boolean isSilent() { + return empty; + } + + public float[] array() { + empty = false; + if (buffer == null) + buffer = new float[size]; + return buffer; + } + + public void get(byte[] buffer, int channel) { + + int framesize_pc = (format.getFrameSize() / format.getChannels()); + int c_len = size * framesize_pc; + if (converter_buffer == null || converter_buffer.length < c_len) + converter_buffer = new byte[c_len]; + + if (format.getChannels() == 1) { + converter.toByteArray(array(), size, buffer); + } else { + converter.toByteArray(array(), size, converter_buffer); + if (channel >= format.getChannels()) + return; + int z_stepover = format.getChannels() * framesize_pc; + int k_stepover = framesize_pc; + for (int j = 0; j < framesize_pc; j++) { + int k = j; + int z = channel * framesize_pc + j; + for (int i = 0; i < size; i++) { + buffer[z] = converter_buffer[k]; + z += z_stepover; + k += k_stepover; + } + } + } + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftAudioProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioProcessor.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Audio processor interface. + * + * @author Karl Helgason + */ +public interface SoftAudioProcessor { + + public void globalParameterControlChange(int[] slothpath, long param, + long value); + + public void init(float samplerate, float controlrate); + + public void setInput(int pin, SoftAudioBuffer input); + + public void setOutput(int pin, SoftAudioBuffer output); + + public void setMixMode(boolean mix); + + public void processAudio(); + + public void processControlLogic(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftAudioPusher.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioPusher.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; + +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.SourceDataLine; + +/** + * This is a processor object that writes into SourceDataLine + * + * @author Karl Helgason + */ +public class SoftAudioPusher implements Runnable { + + private volatile boolean active = false; + private SourceDataLine sourceDataLine = null; + private Thread audiothread; + private AudioInputStream ais; + private byte[] buffer; + + public SoftAudioPusher(SourceDataLine sourceDataLine, AudioInputStream ais, + int workbuffersizer) { + this.ais = ais; + this.buffer = new byte[workbuffersizer]; + this.sourceDataLine = sourceDataLine; + } + + public synchronized void start() { + if (active) + return; + active = true; + audiothread = new Thread(this); + audiothread.setPriority(Thread.MAX_PRIORITY); + audiothread.start(); + } + + public synchronized void stop() { + if (!active) + return; + active = false; + try { + audiothread.join(); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + } + + public void run() { + byte[] buffer = SoftAudioPusher.this.buffer; + AudioInputStream ais = SoftAudioPusher.this.ais; + SourceDataLine sourceDataLine = SoftAudioPusher.this.sourceDataLine; + + try { + while (active) { + // Read from audio source + int count = ais.read(buffer); + if(count < 0) break; + // Write byte buffer to source output + sourceDataLine.write(buffer, 0, count); + } + } catch (IOException e) { + active = false; + //e.printStackTrace(); + } + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftChannel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,1548 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; + +/** + * Software Synthesizer MIDI channel class. + * + * @author Karl Helgason + */ +public class SoftChannel implements MidiChannel, ModelDirectedPlayer { + + private static boolean[] dontResetControls = new boolean[128]; + static { + for (int i = 0; i < dontResetControls.length; i++) + dontResetControls[i] = false; + + dontResetControls[0] = true; // Bank Select (MSB) + dontResetControls[32] = true; // Bank Select (LSB) + dontResetControls[7] = true; // Channel Volume (MSB) + dontResetControls[8] = true; // Balance (MSB) + dontResetControls[10] = true; // Pan (MSB) + dontResetControls[11] = true; // Expression (MSB) + dontResetControls[91] = true; // Effects 1 Depth (default: Reverb Send) + dontResetControls[92] = true; // Effects 2 Depth (default: Tremolo Depth) + dontResetControls[93] = true; // Effects 3 Depth (default: Chorus Send) + dontResetControls[94] = true; // Effects 4 Depth (default: Celeste [Detune] Depth) + dontResetControls[95] = true; // Effects 5 Depth (default: Phaser Depth) + dontResetControls[70] = true; // Sound Controller 1 (default: Sound Variation) + dontResetControls[71] = true; // Sound Controller 2 (default: Timbre / Harmonic Quality) + dontResetControls[72] = true; // Sound Controller 3 (default: Release Time) + dontResetControls[73] = true; // Sound Controller 4 (default: Attack Time) + dontResetControls[74] = true; // Sound Controller 5 (default: Brightness) + dontResetControls[75] = true; // Sound Controller 6 (GM2 default: Decay Time) + dontResetControls[76] = true; // Sound Controller 7 (GM2 default: Vibrato Rate) + dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth) + dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay) + dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined) + dontResetControls[120] = true; // All Sound Off + dontResetControls[121] = true; // Reset All Controllers + dontResetControls[122] = true; // Local Control On/Off + dontResetControls[123] = true; // All Notes Off + dontResetControls[124] = true; // Omni Mode Off + dontResetControls[125] = true; // Omni Mode On + dontResetControls[126] = true; // Poly Mode Off + dontResetControls[127] = true; // Poly Mode On + + dontResetControls[6] = true; // Data Entry (MSB) + dontResetControls[38] = true; // Data Entry (LSB) + dontResetControls[96] = true; // Data Increment + dontResetControls[97] = true; // Data Decrement + dontResetControls[98] = true; // Non-Registered Parameter Number (LSB) + dontResetControls[99] = true; // Non-Registered Parameter Number(MSB) + dontResetControls[100] = true; // RPN = Null + dontResetControls[101] = true; // RPN = Null + + } + + private static final int RPN_NULL_VALUE = (127 << 7) + 127; + private int rpn_control = RPN_NULL_VALUE; + private int nrpn_control = RPN_NULL_VALUE; + protected double portamento_time = 1; // keyschanges per control buffer time + protected int[] portamento_lastnote = new int[128]; + protected int portamento_lastnote_ix = 0; + private int portamento_control_note = -1; + private boolean portamento = false; + private boolean mono = false; + private boolean mute = false; + private boolean solo = false; + private boolean solomute = false; + private Object control_mutex; + private int channel; + private SoftVoice[] voices; + private int bank; + private int program; + private SoftSynthesizer synthesizer; + private SoftMainMixer mainmixer; + private int[] polypressure = new int[128]; + private int channelpressure = 0; + private int[] controller = new int[128]; + private int pitchbend; + private double[] co_midi_pitch = new double[1]; + private double[] co_midi_channel_pressure = new double[1]; + protected SoftTuning tuning = new SoftTuning(); + protected int tuning_bank = 0; + protected int tuning_program = 0; + protected SoftInstrument current_instrument = null; + protected ModelChannelMixer current_mixer = null; + private ModelDirector current_director = null; + + // Controller Destination Settings + protected int cds_control_number = -1; + protected ModelConnectionBlock[] cds_control_connections = null; + protected ModelConnectionBlock[] cds_channelpressure_connections = null; + protected ModelConnectionBlock[] cds_polypressure_connections = null; + protected boolean sustain = false; + protected boolean[][] keybasedcontroller_active = null; + protected double[][] keybasedcontroller_value = null; + + private class MidiControlObject implements SoftControl { + double[] pitch = co_midi_pitch; + double[] channel_pressure = co_midi_channel_pressure; + double[] poly_pressure = new double[1]; + + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("pitch")) + return pitch; + if (name.equals("channel_pressure")) + return channel_pressure; + if (name.equals("poly_pressure")) + return poly_pressure; + return null; + } + } + + private SoftControl[] co_midi = new SoftControl[128]; + { + for (int i = 0; i < co_midi.length; i++) { + co_midi[i] = new MidiControlObject(); + } + } + + private double[][] co_midi_cc_cc = new double[128][1]; + private SoftControl co_midi_cc = new SoftControl() { + double[][] cc = co_midi_cc_cc; + public double[] get(int instance, String name) { + if (name == null) + return null; + return cc[Integer.parseInt(name)]; + } + }; + Map co_midi_rpn_rpn_i = new HashMap(); + Map co_midi_rpn_rpn = new HashMap(); + private SoftControl co_midi_rpn = new SoftControl() { + Map rpn = co_midi_rpn_rpn; + public double[] get(int instance, String name) { + if (name == null) + return null; + int iname = Integer.parseInt(name); + double[] v = rpn.get(iname); + if (v == null) { + v = new double[1]; + rpn.put(iname, v); + } + return v; + } + }; + Map co_midi_nrpn_nrpn_i = new HashMap(); + Map co_midi_nrpn_nrpn = new HashMap(); + private SoftControl co_midi_nrpn = new SoftControl() { + Map nrpn = co_midi_nrpn_nrpn; + public double[] get(int instance, String name) { + if (name == null) + return null; + int iname = Integer.parseInt(name); + double[] v = nrpn.get(iname); + if (v == null) { + v = new double[1]; + nrpn.put(iname, v); + } + return v; + } + }; + + private static int restrict7Bit(int value) + { + if(value < 0) return 0; + if(value > 127) return 127; + return value; + } + + private static int restrict14Bit(int value) + { + if(value < 0) return 0; + if(value > 16256) return 16256; + return value; + } + + public SoftChannel(SoftSynthesizer synth, int channel) { + this.channel = channel; + this.voices = synth.getVoices(); + this.synthesizer = synth; + this.mainmixer = synth.getMainMixer(); + control_mutex = synth.control_mutex; + resetAllControllers(true); + } + + private int findFreeVoice(int x) { + for (int i = x; i < voices.length; i++) + if (!voices[i].active) + return i; + + // No free voice was found, we must steal one + + int vmode = synthesizer.getVoiceAllocationMode(); + if (vmode == 1) { + // DLS Static Voice Allocation + + // * priority ( 10, 1-9, 11-16) + // Search for channel to steal from + int steal_channel = channel; + for (int j = 0; j < voices.length; j++) { + if (voices[j].stealer_channel == null) { + if (steal_channel == 9) { + steal_channel = voices[j].channel; + } else { + if (voices[j].channel != 9) { + if (voices[j].channel > steal_channel) + steal_channel = voices[j].channel; + } + } + } + } + + int voiceNo = -1; + + SoftVoice v = null; + // Search for oldest voice in off state on steal_channel + for (int j = 0; j < voices.length; j++) { + if (voices[j].channel == steal_channel) { + if (voices[j].stealer_channel == null && !voices[j].on) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + } + // Search for oldest voice in on state on steal_channel + if (voiceNo == -1) { + for (int j = 0; j < voices.length; j++) { + if (voices[j].channel == steal_channel) { + if (voices[j].stealer_channel == null) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + } + } + + return voiceNo; + + } else { + // Default Voice Allocation + // * Find voice that is on + // and Find voice which has lowest voiceID ( oldest voice) + // * Or find voice that is off + // and Find voice which has lowest voiceID ( oldest voice) + + int voiceNo = -1; + + SoftVoice v = null; + // Search for oldest voice in off state + for (int j = 0; j < voices.length; j++) { + if (voices[j].stealer_channel == null && !voices[j].on) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + // Search for oldest voice in on state + if (voiceNo == -1) { + + for (int j = 0; j < voices.length; j++) { + if (voices[j].stealer_channel == null) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + } + + return voiceNo; + } + + } + + protected void initVoice(SoftVoice voice, SoftPerformer p, int voiceID, + int noteNumber, int velocity, ModelConnectionBlock[] connectionBlocks, + ModelChannelMixer channelmixer, boolean releaseTriggered) { + if (voice.active) { + // Voice is active , we must steal the voice + voice.stealer_channel = this; + voice.stealer_performer = p; + voice.stealer_voiceID = voiceID; + voice.stealer_noteNumber = noteNumber; + voice.stealer_velocity = velocity; + voice.stealer_extendedConnectionBlocks = connectionBlocks; + voice.stealer_channelmixer = channelmixer; + voice.stealer_releaseTriggered = releaseTriggered; + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].voiceID == voice.voiceID) + voices[i].soundOff(); + return; + } + + voice.extendedConnectionBlocks = connectionBlocks; + voice.channelmixer = channelmixer; + voice.releaseTriggered = releaseTriggered; + voice.voiceID = voiceID; + voice.tuning = tuning; + voice.exclusiveClass = p.exclusiveClass; + voice.softchannel = this; + voice.channel = channel; + voice.bank = bank; + voice.program = program; + voice.instrument = current_instrument; + voice.performer = p; + voice.objects.clear(); + voice.objects.put("midi", co_midi[noteNumber]); + voice.objects.put("midi_cc", co_midi_cc); + voice.objects.put("midi_rpn", co_midi_rpn); + voice.objects.put("midi_nrpn", co_midi_nrpn); + voice.noteOn(noteNumber, velocity); + voice.setMute(mute); + voice.setSoloMute(solomute); + if (releaseTriggered) + return; + if (portamento_control_note != -1) { + voice.co_noteon_keynumber[0] + = (tuning.getTuning(portamento_control_note) / 100.0) + * (1f / 128f); + voice.portamento = true; + portamento_control_note = -1; + } else if (portamento) { + if (mono) { + if (portamento_lastnote[0] != -1) { + voice.co_noteon_keynumber[0] + = (tuning.getTuning(portamento_lastnote[0]) / 100.0) + * (1f / 128f); + voice.portamento = true; + portamento_control_note = -1; + } + portamento_lastnote[0] = noteNumber; + } else { + if (portamento_lastnote_ix != 0) { + portamento_lastnote_ix--; + voice.co_noteon_keynumber[0] + = (tuning.getTuning( + portamento_lastnote[portamento_lastnote_ix]) + / 100.0) + * (1f / 128f); + voice.portamento = true; + } + } + } + } + + public void noteOn(int noteNumber, int velocity) { + noteNumber = restrict7Bit(noteNumber); + velocity = restrict7Bit(velocity); + noteOn_internal(noteNumber, velocity); + if (current_mixer != null) + current_mixer.noteOn(noteNumber, velocity); + } + + private void noteOn_internal(int noteNumber, int velocity) { + + if (velocity == 0) { + noteOff_internal(noteNumber, 64); + return; + } + + synchronized (control_mutex) { + if (sustain) { + sustain = false; + for (int i = 0; i < voices.length; i++) { + if ((voices[i].sustain || voices[i].on) + && voices[i].channel == channel && voices[i].active + && voices[i].note == noteNumber) { + voices[i].sustain = false; + voices[i].on = true; + voices[i].noteOff(0); + } + } + sustain = true; + } + + mainmixer.activity(); + + if (mono) { + if (portamento) { + boolean n_found = false; + for (int i = 0; i < voices.length; i++) { + if (voices[i].on && voices[i].channel == channel + && voices[i].active + && voices[i].releaseTriggered == false) { + voices[i].portamento = true; + voices[i].setNote(noteNumber); + n_found = true; + } + } + if (n_found) { + portamento_lastnote[0] = noteNumber; + return; + } + } + + if (portamento_control_note != -1) { + boolean n_found = false; + for (int i = 0; i < voices.length; i++) { + if (voices[i].on && voices[i].channel == channel + && voices[i].active + && voices[i].note == portamento_control_note + && voices[i].releaseTriggered == false) { + voices[i].portamento = true; + voices[i].setNote(noteNumber); + n_found = true; + } + } + portamento_control_note = -1; + if (n_found) + return; + } + } + + if (mono) + allNotesOff(); + + if (current_instrument == null) { + current_instrument + = synthesizer.findInstrument(program, bank, channel); + if (current_instrument == null) + return; + if (current_mixer != null) + mainmixer.stopMixer(current_mixer); + current_mixer = current_instrument.getSourceInstrument() + .getChannelMixer(this, synthesizer.getFormat()); + if (current_mixer != null) + mainmixer.registerMixer(current_mixer); + current_director = current_instrument.getDirector(this, this); + applyInstrumentCustomization(); + } + prevVoiceID = synthesizer.voiceIDCounter++; + firstVoice = true; + voiceNo = 0; + + int tunedKey = (int)(Math.round(tuning.getTuning()[noteNumber]/100.0)); + play_noteNumber = noteNumber; + play_velocity = velocity; + play_releasetriggered = false; + lastVelocity[noteNumber] = velocity; + current_director.noteOn(tunedKey, velocity); + + /* + SoftPerformer[] performers = current_instrument.getPerformers(); + for (int i = 0; i < performers.length; i++) { + SoftPerformer p = performers[i]; + if (p.keyFrom <= tunedKey && p.keyTo >= tunedKey) { + if (p.velFrom <= velocity && p.velTo >= velocity) { + if (firstVoice) { + firstVoice = false; + if (p.exclusiveClass != 0) { + int x = p.exclusiveClass; + for (int j = 0; j < voices.length; j++) { + if (voices[j].active + && voices[j].channel == channel + && voices[j].exclusiveClass == x) { + if (!(p.selfNonExclusive + && voices[j].note == noteNumber)) + voices[j].shutdown(); + } + } + } + } + voiceNo = findFreeVoice(voiceNo); + if (voiceNo == -1) + return; + initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, + velocity); + } + } + } + */ + } + } + + public void noteOff(int noteNumber, int velocity) { + noteNumber = restrict7Bit(noteNumber); + velocity = restrict7Bit(velocity); + noteOff_internal(noteNumber, velocity); + + if (current_mixer != null) + current_mixer.noteOff(noteNumber, velocity); + } + + private void noteOff_internal(int noteNumber, int velocity) { + synchronized (control_mutex) { + + if (!mono) { + if (portamento) { + if (portamento_lastnote_ix != 127) { + portamento_lastnote[portamento_lastnote_ix] = noteNumber; + portamento_lastnote_ix++; + } + } + } + + mainmixer.activity(); + for (int i = 0; i < voices.length; i++) { + if (voices[i].on && voices[i].channel == channel + && voices[i].note == noteNumber + && voices[i].releaseTriggered == false) { + voices[i].noteOff(velocity); + } + } + + // Try play back note-off triggered voices, + + if (current_instrument == null) { + current_instrument + = synthesizer.findInstrument(program, bank, channel); + if (current_instrument == null) + return; + if (current_mixer != null) + mainmixer.stopMixer(current_mixer); + current_mixer = current_instrument.getSourceInstrument() + .getChannelMixer(this, synthesizer.getFormat()); + if (current_mixer != null) + mainmixer.registerMixer(current_mixer); + current_director = current_instrument.getDirector(this, this); + applyInstrumentCustomization(); + + } + prevVoiceID = synthesizer.voiceIDCounter++; + firstVoice = true; + voiceNo = 0; + + int tunedKey = (int)(Math.round(tuning.getTuning()[noteNumber]/100.0)); + play_noteNumber = noteNumber; + play_velocity = lastVelocity[noteNumber]; + play_releasetriggered = true; + current_director.noteOff(tunedKey, velocity); + + } + } + private int[] lastVelocity = new int[128]; + private int prevVoiceID; + private boolean firstVoice = true; + private int voiceNo = 0; + private int play_noteNumber = 0; + private int play_velocity = 0; + private boolean play_releasetriggered = false; + + public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks) { + + int noteNumber = play_noteNumber; + int velocity = play_velocity; + boolean releasetriggered = play_releasetriggered; + + SoftPerformer p = current_instrument.getPerformers()[performerIndex]; + + if (firstVoice) { + firstVoice = false; + if (p.exclusiveClass != 0) { + int x = p.exclusiveClass; + for (int j = 0; j < voices.length; j++) { + if (voices[j].active && voices[j].channel == channel + && voices[j].exclusiveClass == x) { + if (!(p.selfNonExclusive && voices[j].note == noteNumber)) + voices[j].shutdown(); + } + } + } + } + + voiceNo = findFreeVoice(voiceNo); + + if (voiceNo == -1) + return; + + initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity, + connectionBlocks, current_mixer, releasetriggered); + } + + public void noteOff(int noteNumber) { + if(noteNumber < 0 || noteNumber > 127) return; + noteOff_internal(noteNumber, 64); + } + + public void setPolyPressure(int noteNumber, int pressure) { + noteNumber = restrict7Bit(noteNumber); + pressure = restrict7Bit(pressure); + + if (current_mixer != null) + current_mixer.setPolyPressure(noteNumber, pressure); + + synchronized (control_mutex) { + mainmixer.activity(); + co_midi[noteNumber].get(0, "poly_pressure")[0] = pressure*(1.0/128.0); + polypressure[noteNumber] = pressure; + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].note == noteNumber) + voices[i].setPolyPressure(pressure); + } + } + } + + public int getPolyPressure(int noteNumber) { + synchronized (control_mutex) { + return polypressure[noteNumber]; + } + } + + public void setChannelPressure(int pressure) { + pressure = restrict7Bit(pressure); + if (current_mixer != null) + current_mixer.setChannelPressure(pressure); + synchronized (control_mutex) { + mainmixer.activity(); + co_midi_channel_pressure[0] = pressure * (1.0 / 128.0); + channelpressure = pressure; + for (int i = 0; i < voices.length; i++) { + if (voices[i].active) + voices[i].setChannelPressure(pressure); + } + } + } + + public int getChannelPressure() { + synchronized (control_mutex) { + return channelpressure; + } + } + + protected void applyInstrumentCustomization() { + if (cds_control_connections == null + && cds_channelpressure_connections == null + && cds_polypressure_connections == null) { + return; + } + + ModelInstrument src_instrument = current_instrument.getSourceInstrument(); + ModelPerformer[] performers = src_instrument.getPerformers(); + ModelPerformer[] new_performers = new ModelPerformer[performers.length]; + for (int i = 0; i < new_performers.length; i++) { + ModelPerformer performer = performers[i]; + ModelPerformer new_performer = new ModelPerformer(); + new_performer.setName(performer.getName()); + new_performer.setExclusiveClass(performer.getExclusiveClass()); + new_performer.setKeyFrom(performer.getKeyFrom()); + new_performer.setKeyTo(performer.getKeyTo()); + new_performer.setVelFrom(performer.getVelFrom()); + new_performer.setVelTo(performer.getVelTo()); + new_performer.getOscillators().addAll(performer.getOscillators()); + new_performer.getConnectionBlocks().addAll( + performer.getConnectionBlocks()); + new_performers[i] = new_performer; + + List connblocks = + new_performer.getConnectionBlocks(); + + if (cds_control_connections != null) { + String cc = Integer.toString(cds_control_number); + Iterator iter = connblocks.iterator(); + while (iter.hasNext()) { + ModelConnectionBlock conn = iter.next(); + ModelSource[] sources = conn.getSources(); + boolean removeok = false; + if (sources != null) { + for (int j = 0; j < sources.length; j++) { + ModelSource src = sources[j]; + if ("midi_cc".equals(src.getIdentifier().getObject()) + && cc.equals(src.getIdentifier().getVariable())) { + removeok = true; + } + } + } + if (removeok) + iter.remove(); + } + for (int j = 0; j < cds_control_connections.length; j++) + connblocks.add(cds_control_connections[j]); + } + + if (cds_polypressure_connections != null) { + Iterator iter = connblocks.iterator(); + while (iter.hasNext()) { + ModelConnectionBlock conn = iter.next(); + ModelSource[] sources = conn.getSources(); + boolean removeok = false; + if (sources != null) { + for (int j = 0; j < sources.length; j++) { + ModelSource src = sources[j]; + if ("midi".equals(src.getIdentifier().getObject()) + && "poly_pressure".equals( + src.getIdentifier().getVariable())) { + removeok = true; + } + } + } + if (removeok) + iter.remove(); + } + for (int j = 0; j < cds_polypressure_connections.length; j++) + connblocks.add(cds_polypressure_connections[j]); + } + + + if (cds_channelpressure_connections != null) { + Iterator iter = connblocks.iterator(); + while (iter.hasNext()) { + ModelConnectionBlock conn = iter.next(); + ModelSource[] sources = conn.getSources(); + boolean removeok = false; + if (sources != null) { + for (int j = 0; j < sources.length; j++) { + ModelIdentifier srcid = sources[j].getIdentifier(); + if ("midi".equals(srcid.getObject()) && + "channel_pressure".equals(srcid.getVariable())) { + removeok = true; + } + } + } + if (removeok) + iter.remove(); + } + for (int j = 0; j < cds_channelpressure_connections.length; j++) + connblocks.add(cds_channelpressure_connections[j]); + } + + } + + current_instrument = new SoftInstrument(src_instrument, new_performers); + + } + + private ModelConnectionBlock[] createModelConnections(ModelIdentifier sid, + int[] destination, int[] range) { + + /* + controlled parameter (pp)|range (rr)| Description |Default + -------------------------|----------|-------------------------|------- + 00 Pitch Control | 28H..58H | -24..+24 semitones | 40H + 01 Filter Cutoff Control | 00H..7FH | -9600..+9450 cents | 40H + 02 Amplitude Control | 00H..7FH | 0..(127/64)*100 percent | 40H + 03 LFO Pitch Depth | 00H..7FH | 0..600 cents | 0 + 04 LFO Filter Depth | 00H..7FH | 0..2400 cents | 0 + 05 LFO Amplitude Depth | 00H..7FH | 0..100 percent | 0 + */ + + List conns = new ArrayList(); + + for (int i = 0; i < destination.length; i++) { + int d = destination[i]; + int r = range[i]; + if (d == 0) { + double scale = (r - 64) * 100; + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + new ModelIdentifier("osc", "pitch"))); + conns.add(conn); + + } + if (d == 1) { + double scale = (r / 64.0 - 1.0) * 9600.0; + ModelConnectionBlock conn; + if (scale > 0) { + conn = new ModelConnectionBlock( + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + -scale, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ)); + } else { + conn = new ModelConnectionBlock( + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ)); + } + conns.add(conn); + } + if (d == 2) { + final double scale = (r / 64.0); + ModelTransform mt = new ModelTransform() { + double s = scale; + public double transform(double value) { + if (s < 1) + value = s + (value * (1.0 - s)); + else if (s > 1) + value = 1 + (value * (s - 1.0)); + else + return 0; + return -((5.0 / 12.0) / Math.log(10)) * Math.log(value); + } + }; + + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(sid, mt), -960, + new ModelDestination(ModelDestination.DESTINATION_GAIN)); + conns.add(conn); + + } + if (d == 3) { + double scale = (r / 64.0 - 1.0) * 9600.0; + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + ModelDestination.DESTINATION_PITCH)); + conns.add(conn); + } + if (d == 4) { + double scale = (r / 128.0) * 2400.0; + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ)); + conns.add(conn); + } + if (d == 5) { + final double scale = (r / 127.0); + + ModelTransform mt = new ModelTransform() { + double s = scale; + public double transform(double value) { + return -((5.0 / 12.0) / Math.log(10)) + * Math.log(1 - value * s); + } + }; + + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(sid, mt), + -960, + new ModelDestination( + ModelDestination.DESTINATION_GAIN)); + conns.add(conn); + } + } + + return conns.toArray(new ModelConnectionBlock[conns.size()]); + } + + public void mapPolyPressureToDestination(int[] destination, int[] range) { + current_instrument = null; + if (destination.length == 0) { + cds_polypressure_connections = null; + return; + } + cds_polypressure_connections + = createModelConnections( + new ModelIdentifier("midi", "poly_pressure"), + destination, range); + } + + public void mapChannelPressureToDestination(int[] destination, int[] range) { + current_instrument = null; + if (destination.length == 0) { + cds_channelpressure_connections = null; + return; + } + cds_channelpressure_connections + = createModelConnections( + new ModelIdentifier("midi", "channel_pressure"), + destination, range); + } + + public void mapControlToDestination(int control, int[] destination, int[] range) { + + if (!((control >= 0x01 && control <= 0x1F) + || (control >= 0x40 && control <= 0x5F))) { + cds_control_connections = null; + return; + } + + current_instrument = null; + cds_control_number = control; + if (destination.length == 0) { + cds_control_connections = null; + return; + } + cds_control_connections + = createModelConnections( + new ModelIdentifier("midi_cc", Integer.toString(control)), + destination, range); + } + + public void controlChangePerNote(int noteNumber, int controller, int value) { + +/* + CC# | nn | Name | vv | default | description +-----|------|-------------------------|----------------|------------|------------------------------- +7 |07H |Note Volume |00H-40H-7FH |40H |0-100-(127/64)*100(%)(Relative) +10 |0AH |*Pan |00H-7FH absolute|Preset Value|Left-Center-Right (absolute) +33-63|21-3FH|LSB for |01H-1FH | | +71 |47H |Timbre/Harmonic Intensity|00H-40H-7FH |40H (???) | +72 |48H |Release Time |00H-40H-7FH |40H (???) | +73 |49H |Attack Time |00H-40H-7FH |40H (???) | +74 |4AH |Brightness |00H-40H-7FH |40H (???) | +75 |4BH |Decay Time |00H-40H-7FH |40H (???) | +76 |4CH |Vibrato Rate |00H-40H-7FH |40H (???) | +77 |4DH |Vibrato Depth |00H-40H-7FH |40H (???) | +78 |4EH |Vibrato Delay |00H-40H-7FH |40H (???) | +91 |5BH |*Reverb Send |00H-7FH absolute|Preset Value|Left-Center-Right (absolute) +93 |5DH |*Chorus Send |00H-7FH absolute|Preset Value|Left-Center-Right (absolute) +120 |78H |**Fine Tuning |00H-40H-7FH |40H (???) | +121 |79H |**Coarse Tuning |00H-40H-7FH |40H (???) | +*/ + + if (keybasedcontroller_active == null) { + keybasedcontroller_active = new boolean[128][]; + keybasedcontroller_value = new double[128][]; + } + if (keybasedcontroller_active[noteNumber] == null) { + keybasedcontroller_active[noteNumber] = new boolean[128]; + Arrays.fill(keybasedcontroller_active[noteNumber], false); + keybasedcontroller_value[noteNumber] = new double[128]; + Arrays.fill(keybasedcontroller_value[noteNumber], 0); + } + + if (value == -1) { + keybasedcontroller_active[noteNumber][controller] = false; + } else { + keybasedcontroller_active[noteNumber][controller] = true; + keybasedcontroller_value[noteNumber][controller] = value / 128.0; + } + + if (controller < 120) { + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].controlChange(controller, -1); + } else if (controller == 120) { + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].rpnChange(1, -1); + } else if (controller == 121) { + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].rpnChange(2, -1); + } + + } + + public int getControlPerNote(int noteNumber, int controller) { + if (keybasedcontroller_active == null) + return -1; + if (keybasedcontroller_active[noteNumber] == null) + return -1; + if (!keybasedcontroller_active[noteNumber][controller]) + return -1; + return (int)(keybasedcontroller_value[noteNumber][controller] * 128); + } + + public void controlChange(int controller, int value) { + controller = restrict7Bit(controller); + value = restrict7Bit(value); + if (current_mixer != null) + current_mixer.controlChange(controller, value); + + synchronized (control_mutex) { + switch (controller) { + /* + Mapco_midi_rpn_rpn_i = new HashMap(); + Mapco_midi_rpn_rpn = new HashMap(); + Mapco_midi_nrpn_nrpn_i = new HashMap(); + Mapco_midi_nrpn_nrpn = new HashMap(); + */ + + case 5: + // This produce asin-like curve + // as described in General Midi Level 2 Specification, page 6 + double x = -Math.asin((value / 128.0) * 2 - 1) / Math.PI + 0.5; + x = Math.pow(100000.0, x) / 100.0; // x is now cent/msec + // Convert x from cent/msec to key/controlbuffertime + x = x / 100.0; // x is now keys/msec + x = x * 1000.0; // x is now keys/sec + x = x / synthesizer.getControlRate(); // x is now keys/controlbuffertime + portamento_time = x; + break; + case 6: + case 38: + case 96: + case 97: + int val = 0; + if (nrpn_control != RPN_NULL_VALUE) { + int[] val_i = co_midi_nrpn_nrpn_i.get(nrpn_control); + if (val_i != null) + val = val_i[0]; + } + if (rpn_control != RPN_NULL_VALUE) { + int[] val_i = co_midi_rpn_rpn_i.get(rpn_control); + if (val_i != null) + val = val_i[0]; + } + + if (controller == 6) + val = (val & 127) + (value << 7); + else if (controller == 38) + val = (val & (127 << 7)) + value; + else if (controller == 96 || controller == 97) { + int step = 1; + if (rpn_control == 2 || rpn_control == 3 || rpn_control == 4) + step = 128; + if (controller == 96) + val += step; + if (controller == 97) + val -= step; + } + + if (nrpn_control != RPN_NULL_VALUE) + nrpnChange(nrpn_control, val); + if (rpn_control != RPN_NULL_VALUE) + rpnChange(rpn_control, val); + + break; + case 64: // Hold1 (Damper) (cc#64) + boolean on = value >= 64; + if (sustain != on) { + sustain = on; + if (!on) { + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].sustain && + voices[i].channel == channel) { + voices[i].sustain = false; + if (!voices[i].on) { + voices[i].on = true; + voices[i].noteOff(0); + } + } + } + } else { + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].channel == channel) + voices[i].redamp(); + } + } + break; + case 65: + //allNotesOff(); + portamento = value >= 64; + portamento_lastnote[0] = -1; + /* + for (int i = 0; i < portamento_lastnote.length; i++) + portamento_lastnote[i] = -1; + */ + portamento_lastnote_ix = 0; + break; + case 66: // Sostenuto (cc#66) + on = value >= 64; + if (on) { + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].on && + voices[i].channel == channel) { + voices[i].sostenuto = true; + } + } + } + if (!on) { + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].sostenuto && + voices[i].channel == channel) { + voices[i].sostenuto = false; + if (!voices[i].on) { + voices[i].on = true; + voices[i].noteOff(0); + } + } + } + } + break; + case 84: + portamento_control_note = value; + break; + case 98: + nrpn_control = (nrpn_control & (127 << 7)) + value; + rpn_control = RPN_NULL_VALUE; + break; + case 99: + nrpn_control = (nrpn_control & 127) + (value << 7); + rpn_control = RPN_NULL_VALUE; + break; + case 100: + rpn_control = (rpn_control & (127 << 7)) + value; + nrpn_control = RPN_NULL_VALUE; + break; + case 101: + rpn_control = (rpn_control & 127) + (value << 7); + nrpn_control = RPN_NULL_VALUE; + break; + case 120: + allSoundOff(); + break; + case 121: + resetAllControllers(value == 127); + break; + case 122: + localControl(value >= 64); + break; + case 123: + allNotesOff(); + break; + case 124: + setOmni(false); + break; + case 125: + setOmni(true); + break; + case 126: + if (value == 1) + setMono(true); + break; + case 127: + setMono(false); + break; + + default: + break; + } + + co_midi_cc_cc[controller][0] = value * (1.0 / 128.0); + + if (controller == 0x00) { + bank = /*(bank & 127) +*/ (value << 7); + return; + } + + if (controller == 0x20) { + bank = (bank & (127 << 7)) + value; + return; + } + + this.controller[controller] = value; + if(controller < 0x20) + this.controller[controller + 0x20] = 0; + + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].controlChange(controller, value); + + } + } + + public int getController(int controller) { + synchronized (control_mutex) { + // Should only return lower 7 bits, + // even when controller is "boosted" higher. + return this.controller[controller] & 127; + } + } + + public void tuningChange(int program) { + tuningChange(0, program); + } + + public void tuningChange(int bank, int program) { + synchronized (control_mutex) { + tuning = synthesizer.getTuning(new Patch(bank, program)); + } + } + + public void programChange(int program) { + programChange(bank, program); + } + + public void programChange(int bank, int program) { + bank = restrict7Bit(bank); + program = restrict7Bit(program); + synchronized (control_mutex) { + mainmixer.activity(); + this.bank = bank; + this.program = program; + current_instrument = null; + } + } + + public int getProgram() { + synchronized (control_mutex) { + return program; + } + } + + public void setPitchBend(int bend) { + bend = restrict14Bit(bend); + if (current_mixer != null) + current_mixer.setPitchBend(bend); + synchronized (control_mutex) { + mainmixer.activity(); + co_midi_pitch[0] = bend * (1.0 / 16384.0); + pitchbend = bend; + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].setPitchBend(bend); + } + } + + public int getPitchBend() { + synchronized (control_mutex) { + return pitchbend; + } + } + + public void nrpnChange(int controller, int value) { + + /* + System.out.println("(" + channel + ").nrpnChange(" + + Integer.toHexString(controller >> 7) + + " " + Integer.toHexString(controller & 127) + + ", " + Integer.toHexString(value >> 7) + + " " + Integer.toHexString(value & 127) + ")"); + */ + + if (synthesizer.getGeneralMidiMode() == 0) { + if (controller == (0x01 << 7) + (0x08)) // Vibrato Rate + controlChange(76, value >> 7); + if (controller == (0x01 << 7) + (0x09)) // Vibrato Depth + controlChange(77, value >> 7); + if (controller == (0x01 << 7) + (0x0A)) // Vibrato Delay + controlChange(78, value >> 7); + if (controller == (0x01 << 7) + (0x20)) // Brightness + controlChange(74, value >> 7); + if (controller == (0x01 << 7) + (0x21)) // Filter Resonance + controlChange(71, value >> 7); + if (controller == (0x01 << 7) + (0x63)) // Attack Time + controlChange(73, value >> 7); + if (controller == (0x01 << 7) + (0x64)) // Decay Time + controlChange(75, value >> 7); + if (controller == (0x01 << 7) + (0x66)) // Release Time + controlChange(72, value >> 7); + + if (controller >> 7 == 0x18) // Pitch coarse + controlChangePerNote(controller % 128, 120, value >> 7); + if (controller >> 7 == 0x1A) // Volume + controlChangePerNote(controller % 128, 7, value >> 7); + if (controller >> 7 == 0x1C) // Panpot + controlChangePerNote(controller % 128, 10, value >> 7); + if (controller >> 7 == 0x1D) // Reverb + controlChangePerNote(controller % 128, 91, value >> 7); + if (controller >> 7 == 0x1E) // Chorus + controlChangePerNote(controller % 128, 93, value >> 7); + } + + int[] val_i = co_midi_nrpn_nrpn_i.get(controller); + double[] val_d = co_midi_nrpn_nrpn.get(controller); + if (val_i == null) { + val_i = new int[1]; + co_midi_nrpn_nrpn_i.put(controller, val_i); + } + if (val_d == null) { + val_d = new double[1]; + co_midi_nrpn_nrpn.put(controller, val_d); + } + val_i[0] = value; + val_d[0] = val_i[0] * (1.0 / 16384.0); + + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].nrpnChange(controller, val_i[0]); + + } + + public void rpnChange(int controller, int value) { + + /* + System.out.println("(" + channel + ").rpnChange(" + + Integer.toHexString(controller >> 7) + + " " + Integer.toHexString(controller & 127) + + ", " + Integer.toHexString(value >> 7) + + " " + Integer.toHexString(value & 127) + ")"); + */ + + if (controller == 3) { + tuning_program = (value >> 7) & 127; + tuningChange(tuning_bank, tuning_program); + } + if (controller == 4) { + tuning_bank = (value >> 7) & 127; + } + + int[] val_i = co_midi_rpn_rpn_i.get(controller); + double[] val_d = co_midi_rpn_rpn.get(controller); + if (val_i == null) { + val_i = new int[1]; + co_midi_rpn_rpn_i.put(controller, val_i); + } + if (val_d == null) { + val_d = new double[1]; + co_midi_rpn_rpn.put(controller, val_d); + } + val_i[0] = value; + val_d[0] = val_i[0] * (1.0 / 16384.0); + + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].rpnChange(controller, val_i[0]); + } + + public void resetAllControllers() { + resetAllControllers(false); + } + + public void resetAllControllers(boolean allControls) { + synchronized (control_mutex) { + mainmixer.activity(); + + for (int i = 0; i < 128; i++) { + setPolyPressure(i, 0); + } + setChannelPressure(0); + setPitchBend(8192); + for (int i = 0; i < 128; i++) { + if (!dontResetControls[i]) + controlChange(i, 0); + } + + controlChange(71, 64); // Filter Resonance + controlChange(72, 64); // Release Time + controlChange(73, 64); // Attack Time + controlChange(74, 64); // Brightness + controlChange(75, 64); // Decay Time + controlChange(76, 64); // Vibrato Rate + controlChange(77, 64); // Vibrato Depth + controlChange(78, 64); // Vibrato Delay + + controlChange(8, 64); // Balance + controlChange(11, 127); // Expression + controlChange(98, 127); // NRPN Null + controlChange(99, 127); // NRPN Null + controlChange(100, 127); // RPN = Null + controlChange(101, 127); // RPN = Null + + // see DLS 2.1 (Power-on Default Values) + if (allControls) { + + keybasedcontroller_active = null; + keybasedcontroller_value = null; + + controlChange(7, 100); // Volume + controlChange(10, 64); // Pan + controlChange(91, 40); // Reverb + + for (int controller : co_midi_rpn_rpn.keySet()) { + // don't reset tuning settings + if (controller != 3 && controller != 4) + rpnChange(controller, 0); + } + for (int controller : co_midi_nrpn_nrpn.keySet()) + nrpnChange(controller, 0); + rpnChange(0, 2 << 7); // Bitch Bend sensitivity + rpnChange(1, 64 << 7); // Channel fine tunning + rpnChange(2, 64 << 7); // Channel Coarse Tuning + rpnChange(5, 64); // Modulation Depth, +/- 50 cent + + tuning_bank = 0; + tuning_program = 0; + tuning = new SoftTuning(); + + } + + } + } + + public void allNotesOff() { + if (current_mixer != null) + current_mixer.allNotesOff(); + synchronized (control_mutex) { + for (int i = 0; i < voices.length; i++) + if (voices[i].on && voices[i].channel == channel + && voices[i].releaseTriggered == false) { + voices[i].noteOff(0); + } + } + } + + public void allSoundOff() { + if (current_mixer != null) + current_mixer.allSoundOff(); + synchronized (control_mutex) { + for (int i = 0; i < voices.length; i++) + if (voices[i].on && voices[i].channel == channel) + voices[i].soundOff(); + } + } + + public boolean localControl(boolean on) { + return false; + } + + public void setMono(boolean on) { + if (current_mixer != null) + current_mixer.setMono(on); + synchronized (control_mutex) { + allNotesOff(); + mono = on; + } + } + + public boolean getMono() { + synchronized (control_mutex) { + return mono; + } + } + + public void setOmni(boolean on) { + if (current_mixer != null) + current_mixer.setOmni(on); + allNotesOff(); + // Omni is not supported by GM2 + } + + public boolean getOmni() { + return false; + } + + public void setMute(boolean mute) { + if (current_mixer != null) + current_mixer.setMute(mute); + synchronized (control_mutex) { + this.mute = mute; + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].channel == channel) + voices[i].setMute(mute); + } + } + + public boolean getMute() { + synchronized (control_mutex) { + return mute; + } + } + + public void setSolo(boolean soloState) { + if (current_mixer != null) + current_mixer.setSolo(soloState); + + synchronized (control_mutex) { + this.solo = soloState; + + boolean soloinuse = false; + for (SoftChannel c : synthesizer.channels) { + if (c.solo) { + soloinuse = true; + break; + } + } + + if (!soloinuse) { + for (SoftChannel c : synthesizer.channels) + c.setSoloMute(false); + return; + } + + for (SoftChannel c : synthesizer.channels) + c.setSoloMute(!c.solo); + + } + + } + + private void setSoloMute(boolean mute) { + synchronized (control_mutex) { + if (solomute == mute) + return; + this.solomute = mute; + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].channel == channel) + voices[i].setSoloMute(solomute); + } + } + + public boolean getSolo() { + synchronized (control_mutex) { + return solo; + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftChannelProxy.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChannelProxy.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,202 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiChannel; + +/** + * A MidiChannel proxy object used for external access to synthesizer internal + * channel objects. + * + * @author Karl Helgason + */ +public class SoftChannelProxy implements MidiChannel { + + private MidiChannel channel = null; + + public MidiChannel getChannel() { + return channel; + } + + public void setChannel(MidiChannel channel) { + this.channel = channel; + } + + public void allNotesOff() { + if (channel == null) + return; + channel.allNotesOff(); + } + + public void allSoundOff() { + if (channel == null) + return; + channel.allSoundOff(); + } + + public void controlChange(int controller, int value) { + if (channel == null) + return; + channel.controlChange(controller, value); + } + + public int getChannelPressure() { + if (channel == null) + return 0; + return channel.getChannelPressure(); + } + + public int getController(int controller) { + if (channel == null) + return 0; + return channel.getController(controller); + } + + public boolean getMono() { + if (channel == null) + return false; + return channel.getMono(); + } + + public boolean getMute() { + if (channel == null) + return false; + return channel.getMute(); + } + + public boolean getOmni() { + if (channel == null) + return false; + return channel.getOmni(); + } + + public int getPitchBend() { + if (channel == null) + return 8192; + return channel.getPitchBend(); + } + + public int getPolyPressure(int noteNumber) { + if (channel == null) + return 0; + return channel.getPolyPressure(noteNumber); + } + + public int getProgram() { + if (channel == null) + return 0; + return channel.getProgram(); + } + + public boolean getSolo() { + if (channel == null) + return false; + return channel.getSolo(); + } + + public boolean localControl(boolean on) { + if (channel == null) + return false; + return channel.localControl(on); + } + + public void noteOff(int noteNumber) { + if (channel == null) + return; + channel.noteOff(noteNumber); + } + + public void noteOff(int noteNumber, int velocity) { + if (channel == null) + return; + channel.noteOff(noteNumber, velocity); + } + + public void noteOn(int noteNumber, int velocity) { + if (channel == null) + return; + channel.noteOn(noteNumber, velocity); + } + + public void programChange(int program) { + if (channel == null) + return; + channel.programChange(program); + } + + public void programChange(int bank, int program) { + if (channel == null) + return; + channel.programChange(bank, program); + } + + public void resetAllControllers() { + if (channel == null) + return; + channel.resetAllControllers(); + } + + public void setChannelPressure(int pressure) { + if (channel == null) + return; + channel.setChannelPressure(pressure); + } + + public void setMono(boolean on) { + if (channel == null) + return; + channel.setMono(on); + } + + public void setMute(boolean mute) { + if (channel == null) + return; + channel.setMute(mute); + } + + public void setOmni(boolean on) { + if (channel == null) + return; + channel.setOmni(on); + } + + public void setPitchBend(int bend) { + if (channel == null) + return; + channel.setPitchBend(bend); + } + + public void setPolyPressure(int noteNumber, int pressure) { + if (channel == null) + return; + channel.setPolyPressure(noteNumber, pressure); + } + + public void setSolo(boolean soloState) { + if (channel == null) + return; + channel.setSolo(soloState); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftChorus.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChorus.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,341 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Arrays; + +/** + * A chorus effect made using LFO and variable delay. One for each channel + * (left,right), with different starting phase for stereo effect. + * + * @author Karl Helgason + */ +public class SoftChorus implements SoftAudioProcessor { + + private static class VariableDelay { + + private float[] delaybuffer; + private int rovepos = 0; + private volatile float gain = 1; + private volatile float rgain = 0; + private volatile float delay = 0; + private float lastdelay = 0; + private volatile float feedback = 0; + + public VariableDelay(int maxbuffersize) { + delaybuffer = new float[maxbuffersize]; + } + + public void setDelay(float delay) { + this.delay = delay; + } + + public void setFeedBack(float feedback) { + this.feedback = feedback; + } + + public void setGain(float gain) { + this.gain = gain; + } + + public void setReverbSendGain(float rgain) { + this.rgain = rgain; + } + + public void processMix(float[] in, float[] out, float[] rout) { + float gain = this.gain; + float delay = this.delay; + float feedback = this.feedback; + + float[] delaybuffer = this.delaybuffer; + int len = in.length; + float delaydelta = (delay - lastdelay) / len; + int rnlen = delaybuffer.length; + int rovepos = this.rovepos; + + if (rout == null) + for (int i = 0; i < len; i++) { + float r = rovepos - (lastdelay + 2) + rnlen; + int ri = (int) r; + float s = r - ri; + float a = delaybuffer[ri % rnlen]; + float b = delaybuffer[(ri + 1) % rnlen]; + float o = a * (1 - s) + b * (s); + out[i] += o * gain; + delaybuffer[rovepos] = in[i] + o * feedback; + rovepos = (rovepos + 1) % rnlen; + lastdelay += delaydelta; + } + else + for (int i = 0; i < len; i++) { + float r = rovepos - (lastdelay + 2) + rnlen; + int ri = (int) r; + float s = r - ri; + float a = delaybuffer[ri % rnlen]; + float b = delaybuffer[(ri + 1) % rnlen]; + float o = a * (1 - s) + b * (s); + out[i] += o * gain; + rout[i] += o * rgain; + delaybuffer[rovepos] = in[i] + o * feedback; + rovepos = (rovepos + 1) % rnlen; + lastdelay += delaydelta; + } + this.rovepos = rovepos; + lastdelay = delay; + } + + public void processReplace(float[] in, float[] out, float[] rout) { + Arrays.fill(out, 0); + Arrays.fill(rout, 0); + processMix(in, out, rout); + } + } + + private static class LFODelay { + + private volatile double c_cos_delta; + private volatile double c_sin_delta; + private double c_cos = 1; + private double c_sin = 0; + private double depth = 0; + private VariableDelay vdelay; + private double samplerate; + private double controlrate; + + public LFODelay(double samplerate, double controlrate) { + this.samplerate = samplerate; + this.controlrate = controlrate; + // vdelay = new VariableDelay((int)(samplerate*4)); + vdelay = new VariableDelay((int) ((this.depth + 10) * 2)); + + } + + public void setDepth(double depth) { + this.depth = depth * samplerate; + vdelay = new VariableDelay((int) ((this.depth + 10) * 2)); + } + + public void setRate(double rate) { + double g = (Math.PI * 2) * (rate / controlrate); + c_cos_delta = Math.cos(g); + c_sin_delta = Math.sin(g); + } + + public void setPhase(double phase) { + c_cos = Math.cos(phase); + c_sin = Math.sin(phase); + } + + public void setFeedBack(float feedback) { + vdelay.setFeedBack(feedback); + } + + public void setGain(float gain) { + vdelay.setGain(gain); + } + + public void setReverbSendGain(float rgain) { + vdelay.setReverbSendGain(rgain); + } + + public void processMix(float[] in, float[] out, float[] rout) { + c_cos = c_cos * c_cos_delta - c_sin * c_sin_delta; + c_sin = c_cos * c_sin_delta + c_sin * c_cos_delta; + vdelay.setDelay((float) (depth * 0.5 * (c_cos + 2))); + vdelay.processMix(in, out, rout); + } + + public void processReplace(float[] in, float[] out, float[] rout) { + c_cos = c_cos * c_cos_delta - c_sin * c_sin_delta; + c_sin = c_cos * c_sin_delta + c_sin * c_cos_delta; + vdelay.setDelay((float) (depth * 0.5 * (c_cos + 2))); + vdelay.processReplace(in, out, rout); + + } + } + private boolean mix = true; + private SoftAudioBuffer inputA; + private SoftAudioBuffer left; + private SoftAudioBuffer right; + private SoftAudioBuffer reverb; + private LFODelay vdelay1L; + private LFODelay vdelay1R; + private float rgain = 0; + private boolean dirty = true; + private double dirty_vdelay1L_rate; + private double dirty_vdelay1R_rate; + private double dirty_vdelay1L_depth; + private double dirty_vdelay1R_depth; + private float dirty_vdelay1L_feedback; + private float dirty_vdelay1R_feedback; + private float dirty_vdelay1L_reverbsendgain; + private float dirty_vdelay1R_reverbsendgain; + private float controlrate; + + public void init(float samplerate, float controlrate) { + this.controlrate = controlrate; + vdelay1L = new LFODelay(samplerate, controlrate); + vdelay1R = new LFODelay(samplerate, controlrate); + vdelay1L.setGain(1.0f); // % + vdelay1R.setGain(1.0f); // % + vdelay1L.setPhase(0.5 * Math.PI); + vdelay1R.setPhase(0); + + globalParameterControlChange(new int[]{0x01 * 128 + 0x02}, 0, 2); + } + + public void globalParameterControlChange(int[] slothpath, long param, + long value) { + if (slothpath.length == 1) { + if (slothpath[0] == 0x01 * 128 + 0x02) { + if (param == 0) { // Chorus Type + switch ((int)value) { + case 0: // Chorus 1 0 (0%) 3 (0.4Hz) 5 (1.9ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 0); + globalParameterControlChange(slothpath, 1, 3); + globalParameterControlChange(slothpath, 2, 5); + globalParameterControlChange(slothpath, 4, 0); + break; + case 1: // Chorus 2 5 (4%) 9 (1.1Hz) 19 (6.3ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 5); + globalParameterControlChange(slothpath, 1, 9); + globalParameterControlChange(slothpath, 2, 19); + globalParameterControlChange(slothpath, 4, 0); + break; + case 2: // Chorus 3 8 (6%) 3 (0.4Hz) 19 (6.3ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 8); + globalParameterControlChange(slothpath, 1, 3); + globalParameterControlChange(slothpath, 2, 19); + globalParameterControlChange(slothpath, 4, 0); + break; + case 3: // Chorus 4 16 (12%) 9 (1.1Hz) 16 (5.3ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 16); + globalParameterControlChange(slothpath, 1, 9); + globalParameterControlChange(slothpath, 2, 16); + globalParameterControlChange(slothpath, 4, 0); + break; + case 4: // FB Chorus 64 (49%) 2 (0.2Hz) 24 (7.8ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 64); + globalParameterControlChange(slothpath, 1, 2); + globalParameterControlChange(slothpath, 2, 24); + globalParameterControlChange(slothpath, 4, 0); + break; + case 5: // Flanger 112 (86%) 1 (0.1Hz) 5 (1.9ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 112); + globalParameterControlChange(slothpath, 1, 1); + globalParameterControlChange(slothpath, 2, 5); + globalParameterControlChange(slothpath, 4, 0); + break; + default: + break; + } + } else if (param == 1) { // Mod Rate + dirty_vdelay1L_rate = (value * 0.122); + dirty_vdelay1R_rate = (value * 0.122); + dirty = true; + } else if (param == 2) { // Mod Depth + dirty_vdelay1L_depth = ((value + 1) / 3200.0); + dirty_vdelay1R_depth = ((value + 1) / 3200.0); + dirty = true; + } else if (param == 3) { // Feedback + dirty_vdelay1L_feedback = (value * 0.00763f); + dirty_vdelay1R_feedback = (value * 0.00763f); + dirty = true; + } + if (param == 4) { // Send to Reverb + rgain = value * 0.00787f; + dirty_vdelay1L_reverbsendgain = (value * 0.00787f); + dirty_vdelay1R_reverbsendgain = (value * 0.00787f); + dirty = true; + } + + } + } + } + + public void processControlLogic() { + if (dirty) { + dirty = false; + vdelay1L.setRate(dirty_vdelay1L_rate); + vdelay1R.setRate(dirty_vdelay1R_rate); + vdelay1L.setDepth(dirty_vdelay1L_depth); + vdelay1R.setDepth(dirty_vdelay1R_depth); + vdelay1L.setFeedBack(dirty_vdelay1L_feedback); + vdelay1R.setFeedBack(dirty_vdelay1R_feedback); + vdelay1L.setReverbSendGain(dirty_vdelay1L_reverbsendgain); + vdelay1R.setReverbSendGain(dirty_vdelay1R_reverbsendgain); + } + } + double silentcounter = 1000; + + public void processAudio() { + + if (inputA.isSilent()) { + silentcounter += 1 / controlrate; + + if (silentcounter > 1) { + if (!mix) { + left.clear(); + right.clear(); + } + return; + } + } else + silentcounter = 0; + + float[] inputA = this.inputA.array(); + float[] left = this.left.array(); + float[] right = this.right == null ? null : this.right.array(); + float[] reverb = rgain != 0 ? this.reverb.array() : null; + + if (mix) { + vdelay1L.processMix(inputA, left, reverb); + if (right != null) + vdelay1R.processMix(inputA, right, reverb); + } else { + vdelay1L.processReplace(inputA, left, reverb); + if (right != null) + vdelay1R.processReplace(inputA, right, reverb); + } + } + + public void setInput(int pin, SoftAudioBuffer input) { + if (pin == 0) + inputA = input; + } + + public void setMixMode(boolean mix) { + this.mix = mix; + } + + public void setOutput(int pin, SoftAudioBuffer output) { + if (pin == 0) + left = output; + if (pin == 1) + right = output; + if (pin == 2) + reverb = output; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftControl.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,36 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * SoftControl are the basic controls + * used for control-rate processing. + * + * @author Karl Helgason + */ +public interface SoftControl { + + public double[] get(int instance, String name); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftCubicResampler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftCubicResampler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,87 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses third-order (cubic) interpolation. + * + * @author Karl Helgason + */ +public class SoftCubicResampler extends SoftAbstractResampler { + + public int getPadding() { + return 3; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0) { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float y0 = in[iix - 1]; + float y1 = in[iix]; + float y2 = in[iix + 1]; + float y3 = in[iix + 2]; + float a0 = y3 - y2 + y1 - y0; + float a1 = y0 - y1 - a0; + float a2 = y2 - y0; + float a3 = y1; + //float fix2 = fix * fix; + //out[ox++] = (a0 * fix + a1) * fix2 + (a2 * fix + a3); + out[ox++] = ((a0 * fix + a1) * fix + a2) * fix + a3; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float y0 = in[iix - 1]; + float y1 = in[iix]; + float y2 = in[iix + 1]; + float y3 = in[iix + 2]; + float a0 = y3 - y2 + y1 - y0; + float a1 = y0 - y1 - a0; + float a2 = y2 - y0; + float a3 = y1; + //float fix2 = fix * fix; + //out[ox++] = (a0 * fix + a1) * fix2 + (a2 * fix + a3); + out[ox++] = ((a0 * fix + a1) * fix + a2) * fix + a3; + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,298 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * AHDSR control signal envelope generator. + * + * @author Karl Helgason + */ +public class SoftEnvelopeGenerator implements SoftProcess { + + public final static int EG_OFF = 0; + public final static int EG_DELAY = 1; + public final static int EG_ATTACK = 2; + public final static int EG_HOLD = 3; + public final static int EG_DECAY = 4; + public final static int EG_SUSTAIN = 5; + public final static int EG_RELEASE = 6; + public final static int EG_SHUTDOWN = 7; + public final static int EG_END = 8; + int max_count = 10; + int used_count = 0; + private int[] stage = new int[max_count]; + private int[] stage_ix = new int[max_count]; + private double[] stage_v = new double[max_count]; + private int[] stage_count = new int[max_count]; + private double[][] on = new double[max_count][1]; + private double[][] active = new double[max_count][1]; + private double[][] out = new double[max_count][1]; + private double[][] delay = new double[max_count][1]; + private double[][] attack = new double[max_count][1]; + private double[][] hold = new double[max_count][1]; + private double[][] decay = new double[max_count][1]; + private double[][] sustain = new double[max_count][1]; + private double[][] release = new double[max_count][1]; + private double[][] shutdown = new double[max_count][1]; + private double[][] release2 = new double[max_count][1]; + private double[][] attack2 = new double[max_count][1]; + private double[][] decay2 = new double[max_count][1]; + private double control_time = 0; + + public void reset() { + for (int i = 0; i < used_count; i++) { + stage[i] = 0; + on[i][0] = 0; + out[i][0] = 0; + delay[i][0] = 0; + attack[i][0] = 0; + hold[i][0] = 0; + decay[i][0] = 0; + sustain[i][0] = 0; + release[i][0] = 0; + shutdown[i][0] = 0; + attack2[i][0] = 0; + decay2[i][0] = 0; + release2[i][0] = 0; + } + used_count = 0; + } + + public void init(SoftSynthesizer synth) { + control_time = 1.0 / synth.getControlRate(); + processControlLogic(); + } + + public double[] get(int instance, String name) { + if (instance >= used_count) + used_count = instance + 1; + if (name == null) + return out[instance]; + if (name.equals("on")) + return on[instance]; + if (name.equals("active")) + return active[instance]; + if (name.equals("delay")) + return delay[instance]; + if (name.equals("attack")) + return attack[instance]; + if (name.equals("hold")) + return hold[instance]; + if (name.equals("decay")) + return decay[instance]; + if (name.equals("sustain")) + return sustain[instance]; + if (name.equals("release")) + return release[instance]; + if (name.equals("shutdown")) + return shutdown[instance]; + if (name.equals("attack2")) + return attack2[instance]; + if (name.equals("decay2")) + return decay2[instance]; + if (name.equals("release2")) + return release2[instance]; + + return null; + } + + public void processControlLogic() { + for (int i = 0; i < used_count; i++) { + + if (stage[i] == EG_END) + continue; + + if ((stage[i] > EG_OFF) && (stage[i] < EG_RELEASE)) { + if (on[i][0] < 0.5) { + if (on[i][0] < -0.5) { + stage_count[i] = (int)(Math.pow(2, + this.shutdown[i][0] / 1200.0) / control_time); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_v[i] = out[i][0]; + stage_ix[i] = 0; + stage[i] = EG_SHUTDOWN; + } else { + if ((release2[i][0] < 0.000001) && release[i][0] < 0 + && Double.isInfinite(release[i][0])) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + continue; + } + + stage_count[i] = (int)(Math.pow(2, + this.release[i][0] / 1200.0) / control_time); + stage_count[i] + += (int)(this.release2[i][0]/(control_time * 1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + // stage_v[i] = out[i][0]; + stage_ix[i] = 0; + + double m = 1 - out[i][0]; + stage_ix[i] = (int)(stage_count[i] * m); + + stage[i] = EG_RELEASE; + } + } + } + + switch (stage[i]) { + case EG_OFF: + active[i][0] = 1; + if (on[i][0] < 0.5) + break; + stage[i] = EG_DELAY; + stage_ix[i] = (int)(Math.pow(2, + this.delay[i][0] / 1200.0) / control_time); + if (stage_ix[i] < 0) + stage_ix[i] = 0; + case EG_DELAY: + if (stage_ix[i] == 0) { + double attack = this.attack[i][0]; + double attack2 = this.attack2[i][0]; + + if (attack2 < 0.000001 + && (attack < 0 && Double.isInfinite(attack))) { + out[i][0] = 1; + stage[i] = EG_HOLD; + stage_count[i] = (int)(Math.pow(2, + this.hold[i][0] / 1200.0) / control_time); + stage_ix[i] = 0; + } else { + stage[i] = EG_ATTACK; + stage_count[i] = (int)(Math.pow(2, + attack / 1200.0) / control_time); + stage_count[i] += (int)(attack2 / (control_time * 1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_ix[i] = 0; + } + } else + stage_ix[i]--; + break; + case EG_ATTACK: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = 1; + stage[i] = EG_HOLD; + } else { + // CONVEX attack + double a = ((double)stage_ix[i]) / ((double)stage_count[i]); + a = 1 + ((40.0 / 96.0) / Math.log(10)) * Math.log(a); + if (a < 0) + a = 0; + else if (a > 1) + a = 1; + out[i][0] = a; + } + break; + case EG_HOLD: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + stage[i] = EG_DECAY; + stage_count[i] = (int)(Math.pow(2, + this.decay[i][0] / 1200.0) / control_time); + stage_count[i] += (int)(this.decay2[i][0]/(control_time*1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_ix[i] = 0; + } + break; + case EG_DECAY: + stage_ix[i]++; + double sustain = this.sustain[i][0] * (1.0 / 1000.0); + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = sustain; + stage[i] = EG_SUSTAIN; + if (sustain < 0.001) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + } + } else { + double m = ((double)stage_ix[i]) / ((double)stage_count[i]); + out[i][0] = (1 - m) + sustain * m; + } + break; + case EG_SUSTAIN: + break; + case EG_RELEASE: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + } else { + double m = ((double)stage_ix[i]) / ((double)stage_count[i]); + out[i][0] = (1 - m); // *stage_v[i]; + + if (on[i][0] < -0.5) { + stage_count[i] = (int)(Math.pow(2, + this.shutdown[i][0] / 1200.0) / control_time); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_v[i] = out[i][0]; + stage_ix[i] = 0; + stage[i] = EG_SHUTDOWN; + } + + // re-damping + if (on[i][0] > 0.5) { + sustain = this.sustain[i][0] * (1.0 / 1000.0); + if (out[i][0] > sustain) { + stage[i] = EG_DECAY; + stage_count[i] = (int)(Math.pow(2, + this.decay[i][0] / 1200.0) / control_time); + stage_count[i] += + (int)(this.decay2[i][0]/(control_time*1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + m = (out[i][0] - 1) / (sustain - 1); + stage_ix[i] = (int) (stage_count[i] * m); + } + } + + } + break; + case EG_SHUTDOWN: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + } else { + double m = ((double)stage_ix[i]) / ((double)stage_count[i]); + out[i][0] = (1 - m) * stage_v[i]; + } + break; + default: + break; + } + } + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftFilter.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,614 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Infinite impulse response (IIR) filter class. + * + * The filters where implemented and adapted using algorithms from musicdsp.org + * archive: 1-RC and C filter, Simple 2-pole LP LP and HP filter, biquad, + * tweaked butterworth RBJ Audio-EQ-Cookbook, EQ filter kookbook + * + * @author Karl Helgason + */ +public class SoftFilter { + + public final static int FILTERTYPE_LP6 = 0x00; + public final static int FILTERTYPE_LP12 = 0x01; + public final static int FILTERTYPE_HP12 = 0x11; + public final static int FILTERTYPE_BP12 = 0x21; + public final static int FILTERTYPE_NP12 = 0x31; + public final static int FILTERTYPE_LP24 = 0x03; + public final static int FILTERTYPE_HP24 = 0x13; + + // + // 0x0 = 1st-order, 6 dB/oct + // 0x1 = 2nd-order, 12 dB/oct + // 0x2 = 3rd-order, 18 dB/oct + // 0x3 = 4th-order, 24 db/oct + // + // 0x00 = LP, Low Pass Filter + // 0x10 = HP, High Pass Filter + // 0x20 = BP, Band Pass Filter + // 0x30 = NP, Notch or Band Elimination Filter + // + private int filtertype = FILTERTYPE_LP6; + private float samplerate; + private float x1; + private float x2; + private float y1; + private float y2; + private float xx1; + private float xx2; + private float yy1; + private float yy2; + private float a0; + private float a1; + private float a2; + private float b1; + private float b2; + private float q; + private float gain = 1; + private float wet = 0; + private float last_wet = 0; + private float last_a0; + private float last_a1; + private float last_a2; + private float last_b1; + private float last_b2; + private float last_q; + private float last_gain; + private boolean last_set = false; + private double cutoff = 44100; + private double resonancedB = 0; + private boolean dirty = true; + + public SoftFilter(float samplerate) { + this.samplerate = samplerate; + dirty = true; + } + + public void setFrequency(double cent) { + if (cutoff == cent) + return; + cutoff = cent; + dirty = true; + } + + public void setResonance(double db) { + if (resonancedB == db) + return; + resonancedB = db; + dirty = true; + } + + public void reset() { + dirty = true; + last_set = false; + x1 = 0; + x2 = 0; + y1 = 0; + y2 = 0; + xx1 = 0; + xx2 = 0; + yy1 = 0; + yy2 = 0; + wet = 0.0f; + gain = 1.0f; + a0 = 0; + a1 = 0; + a2 = 0; + b1 = 0; + b2 = 0; + } + + public void setFilterType(int filtertype) { + this.filtertype = filtertype; + } + + public void processAudio(SoftAudioBuffer sbuffer) { + if (filtertype == FILTERTYPE_LP6) + filter1(sbuffer); + if (filtertype == FILTERTYPE_LP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_HP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_BP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_NP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_LP24) + filter4(sbuffer); + if (filtertype == FILTERTYPE_HP24) + filter4(sbuffer); + } + + public void filter4(SoftAudioBuffer sbuffer) { + + float[] buffer = sbuffer.array(); + + if (dirty) { + filter2calc(); + dirty = false; + } + if (!last_set) { + last_a0 = a0; + last_a1 = a1; + last_a2 = a2; + last_b1 = b1; + last_b2 = b2; + last_gain = gain; + last_wet = wet; + last_set = true; + } + + if (wet > 0 || last_wet > 0) { + + int len = buffer.length; + float a0 = this.last_a0; + float a1 = this.last_a1; + float a2 = this.last_a2; + float b1 = this.last_b1; + float b2 = this.last_b2; + float gain = this.last_gain; + float wet = this.last_wet; + float a0_delta = (this.a0 - this.last_a0) / len; + float a1_delta = (this.a1 - this.last_a1) / len; + float a2_delta = (this.a2 - this.last_a2) / len; + float b1_delta = (this.b1 - this.last_b1) / len; + float b2_delta = (this.b2 - this.last_b2) / len; + float gain_delta = (this.gain - this.last_gain) / len; + float wet_delta = (this.wet - this.last_wet) / len; + float x1 = this.x1; + float x2 = this.x2; + float y1 = this.y1; + float y2 = this.y2; + float xx1 = this.xx1; + float xx2 = this.xx2; + float yy1 = this.yy1; + float yy2 = this.yy2; + + if (wet_delta != 0) { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + wet += wet_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + float xx = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + float yy = (a0*xx + a1*xx1 + a2*xx2 - b1*yy1 - b2*yy2); + buffer[i] = (yy * gain) * wet + (xx) * (1 - wet); + xx2 = xx1; + xx1 = xx; + yy2 = yy1; + yy1 = yy; + } + } else if (a0_delta == 0 && a1_delta == 0 && a2_delta == 0 + && b1_delta == 0 && b2_delta == 0) { + for (int i = 0; i < len; i++) { + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + float xx = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + float yy = (a0*xx + a1*xx1 + a2*xx2 - b1*yy1 - b2*yy2); + buffer[i] = (yy * gain) * wet + (xx) * (1 - wet); + xx2 = xx1; + xx1 = xx; + yy2 = yy1; + yy1 = yy; + } + } else { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + float xx = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + float yy = (a0*xx + a1*xx1 + a2*xx2 - b1*yy1 - b2*yy2); + buffer[i] = (yy * gain) * wet + (xx) * (1 - wet); + xx2 = xx1; + xx1 = xx; + yy2 = yy1; + yy1 = yy; + } + } + + if (Math.abs(x1) < 1.0E-8) + x1 = 0; + if (Math.abs(x2) < 1.0E-8) + x2 = 0; + if (Math.abs(y1) < 1.0E-8) + y1 = 0; + if (Math.abs(y2) < 1.0E-8) + y2 = 0; + this.x1 = x1; + this.x2 = x2; + this.y1 = y1; + this.y2 = y2; + this.xx1 = xx1; + this.xx2 = xx2; + this.yy1 = yy1; + this.yy2 = yy2; + } + + this.last_a0 = this.a0; + this.last_a1 = this.a1; + this.last_a2 = this.a2; + this.last_b1 = this.b1; + this.last_b2 = this.b2; + this.last_gain = this.gain; + this.last_wet = this.wet; + + } + + private double sinh(double x) { + return (Math.exp(x) - Math.exp(-x)) * 0.5; + } + + public void filter2calc() { + + double resonancedB = this.resonancedB; + if (resonancedB < 0) + resonancedB = 0; // Negative dB are illegal. + if (resonancedB > 30) + resonancedB = 30; // At least 22.5 dB is needed. + if (filtertype == FILTERTYPE_LP24 || filtertype == FILTERTYPE_HP24) + resonancedB *= 0.6; + + if (filtertype == FILTERTYPE_BP12) { + wet = 1; + double r = (cutoff / samplerate); + if (r > 0.45) + r = 0.45; + + double bandwidth = Math.PI * Math.pow(10.0, -(resonancedB / 20)); + + double omega = 2 * Math.PI * r; + double cs = Math.cos(omega); + double sn = Math.sin(omega); + double alpha = sn * sinh((Math.log(2)*bandwidth*omega) / (sn * 2)); + + double b0 = alpha; + double b1 = 0; + double b2 = -alpha; + double a0 = 1 + alpha; + double a1 = -2 * cs; + double a2 = 1 - alpha; + + double cf = 1.0 / a0; + this.b1 = (float) (a1 * cf); + this.b2 = (float) (a2 * cf); + this.a0 = (float) (b0 * cf); + this.a1 = (float) (b1 * cf); + this.a2 = (float) (b2 * cf); + } + + if (filtertype == FILTERTYPE_NP12) { + wet = 1; + double r = (cutoff / samplerate); + if (r > 0.45) + r = 0.45; + + double bandwidth = Math.PI * Math.pow(10.0, -(resonancedB / 20)); + + double omega = 2 * Math.PI * r; + double cs = Math.cos(omega); + double sn = Math.sin(omega); + double alpha = sn * sinh((Math.log(2)*bandwidth*omega) / (sn*2)); + + double b0 = 1; + double b1 = -2 * cs; + double b2 = 1; + double a0 = 1 + alpha; + double a1 = -2 * cs; + double a2 = 1 - alpha; + + double cf = 1.0 / a0; + this.b1 = (float)(a1 * cf); + this.b2 = (float)(a2 * cf); + this.a0 = (float)(b0 * cf); + this.a1 = (float)(b1 * cf); + this.a2 = (float)(b2 * cf); + } + + if (filtertype == FILTERTYPE_LP12 || filtertype == FILTERTYPE_LP24) { + double r = (cutoff / samplerate); + if (r > 0.45) { + if (wet == 0) { + if (resonancedB < 0.00001) + wet = 0.0f; + else + wet = 1.0f; + } + r = 0.45; + } else + wet = 1.0f; + + double c = 1.0 / (Math.tan(Math.PI * r)); + double csq = c * c; + double resonance = Math.pow(10.0, -(resonancedB / 20)); + double q = Math.sqrt(2.0f) * resonance; + double a0 = 1.0 / (1.0 + (q * c) + (csq)); + double a1 = 2.0 * a0; + double a2 = a0; + double b1 = (2.0 * a0) * (1.0 - csq); + double b2 = a0 * (1.0 - (q * c) + csq); + + this.a0 = (float)a0; + this.a1 = (float)a1; + this.a2 = (float)a2; + this.b1 = (float)b1; + this.b2 = (float)b2; + + } + + if (filtertype == FILTERTYPE_HP12 || filtertype == FILTERTYPE_HP24) { + double r = (cutoff / samplerate); + if (r > 0.45) + r = 0.45; + if (r < 0.0001) + r = 0.0001; + wet = 1.0f; + double c = (Math.tan(Math.PI * (r))); + double csq = c * c; + double resonance = Math.pow(10.0, -(resonancedB / 20)); + double q = Math.sqrt(2.0f) * resonance; + double a0 = 1.0 / (1.0 + (q * c) + (csq)); + double a1 = -2.0 * a0; + double a2 = a0; + double b1 = (2.0 * a0) * (csq - 1.0); + double b2 = a0 * (1.0 - (q * c) + csq); + + this.a0 = (float)a0; + this.a1 = (float)a1; + this.a2 = (float)a2; + this.b1 = (float)b1; + this.b2 = (float)b2; + + } + + } + + public void filter2(SoftAudioBuffer sbuffer) { + + float[] buffer = sbuffer.array(); + + if (dirty) { + filter2calc(); + dirty = false; + } + if (!last_set) { + last_a0 = a0; + last_a1 = a1; + last_a2 = a2; + last_b1 = b1; + last_b2 = b2; + last_q = q; + last_gain = gain; + last_wet = wet; + last_set = true; + } + + if (wet > 0 || last_wet > 0) { + + int len = buffer.length; + float a0 = this.last_a0; + float a1 = this.last_a1; + float a2 = this.last_a2; + float b1 = this.last_b1; + float b2 = this.last_b2; + float gain = this.last_gain; + float wet = this.last_wet; + float a0_delta = (this.a0 - this.last_a0) / len; + float a1_delta = (this.a1 - this.last_a1) / len; + float a2_delta = (this.a2 - this.last_a2) / len; + float b1_delta = (this.b1 - this.last_b1) / len; + float b2_delta = (this.b2 - this.last_b2) / len; + float gain_delta = (this.gain - this.last_gain) / len; + float wet_delta = (this.wet - this.last_wet) / len; + float x1 = this.x1; + float x2 = this.x2; + float y1 = this.y1; + float y2 = this.y2; + + if (wet_delta != 0) { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + wet += wet_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + buffer[i] = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + } else if (a0_delta == 0 && a1_delta == 0 && a2_delta == 0 + && b1_delta == 0 && b2_delta == 0) { + for (int i = 0; i < len; i++) { + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + buffer[i] = y * gain; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + } else { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + buffer[i] = y * gain; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + } + + if (Math.abs(x1) < 1.0E-8) + x1 = 0; + if (Math.abs(x2) < 1.0E-8) + x2 = 0; + if (Math.abs(y1) < 1.0E-8) + y1 = 0; + if (Math.abs(y2) < 1.0E-8) + y2 = 0; + this.x1 = x1; + this.x2 = x2; + this.y1 = y1; + this.y2 = y2; + } + + this.last_a0 = this.a0; + this.last_a1 = this.a1; + this.last_a2 = this.a2; + this.last_b1 = this.b1; + this.last_b2 = this.b2; + this.last_q = this.q; + this.last_gain = this.gain; + this.last_wet = this.wet; + + } + + public void filter1calc() { + if (cutoff < 120) + cutoff = 120; + double c = (7.0 / 6.0) * Math.PI * 2 * cutoff / samplerate; + if (c > 1) + c = 1; + a0 = (float)(Math.sqrt(1 - Math.cos(c)) * Math.sqrt(0.5 * Math.PI)); + if (resonancedB < 0) + resonancedB = 0; + if (resonancedB > 20) + resonancedB = 20; + q = (float)(Math.sqrt(0.5) * Math.pow(10.0, -(resonancedB / 20))); + gain = (float)Math.pow(10, -((resonancedB)) / 40.0); + if (wet == 0.0f) + if (resonancedB > 0.00001 || c < 0.9999999) + wet = 1.0f; + } + + public void filter1(SoftAudioBuffer sbuffer) { + + float[] buffer = sbuffer.array(); + + if (dirty) { + filter1calc(); + dirty = false; + } + if (!last_set) { + last_a0 = a0; + last_q = q; + last_gain = gain; + last_wet = wet; + last_set = true; + } + + if (wet > 0 || last_wet > 0) { + + int len = buffer.length; + float a0 = this.last_a0; + float q = this.last_q; + float gain = this.last_gain; + float wet = this.last_wet; + float a0_delta = (this.a0 - this.last_a0) / len; + float q_delta = (this.q - this.last_q) / len; + float gain_delta = (this.gain - this.last_gain) / len; + float wet_delta = (this.wet - this.last_wet) / len; + float y2 = this.y2; + float y1 = this.y1; + + if (wet_delta != 0) { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + q += q_delta; + gain += gain_delta; + wet += wet_delta; + y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i]; + y2 = (1 - q * a0) * y2 + (a0) * y1; + buffer[i] = y2 * gain * wet + buffer[i] * (1 - wet); + } + } else if (a0_delta == 0 && q_delta == 0) { + for (int i = 0; i < len; i++) { + y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i]; + y2 = (1 - q * a0) * y2 + (a0) * y1; + buffer[i] = y2 * gain; + } + } else { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + q += q_delta; + gain += gain_delta; + y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i]; + y2 = (1 - q * a0) * y2 + (a0) * y1; + buffer[i] = y2 * gain; + } + } + + if (Math.abs(y2) < 1.0E-8) + y2 = 0; + if (Math.abs(y1) < 1.0E-8) + y1 = 0; + this.y2 = y2; + this.y1 = y1; + } + + this.last_a0 = this.a0; + this.last_q = this.q; + this.last_gain = this.gain; + this.last_wet = this.wet; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; + +/** + * Software synthesizer internal instrument. + * + * @author Karl Helgason + */ +public class SoftInstrument extends Instrument { + + private SoftPerformer[] performers; + private ModelPerformer[] modelperformers; + private Object data; + private ModelInstrument ins; + + public SoftInstrument(ModelInstrument ins) { + super(ins.getSoundbank(), ins.getPatch(), ins.getName(), + ins.getDataClass()); + data = ins.getData(); + this.ins = ins; + initPerformers(((ModelInstrument)ins).getPerformers()); + } + + public SoftInstrument(ModelInstrument ins, + ModelPerformer[] overrideperformers) { + super(ins.getSoundbank(), ins.getPatch(), ins.getName(), + ins.getDataClass()); + data = ins.getData(); + this.ins = ins; + initPerformers(overrideperformers); + } + + private void initPerformers(ModelPerformer[] modelperformers) { + this.modelperformers = modelperformers; + performers = new SoftPerformer[modelperformers.length]; + for (int i = 0; i < modelperformers.length; i++) + performers[i] = new SoftPerformer(modelperformers[i]); + } + + public ModelDirector getDirector(MidiChannel channel, + ModelDirectedPlayer player) { + return ins.getDirector(modelperformers, channel, player); + } + + public ModelInstrument getSourceInstrument() { + return ins; + } + + public Object getData() { + return data; + } + + public SoftPerformer[] getPerformers() { + return performers; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftJitterCorrector.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftJitterCorrector.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,276 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +/** + * A jitter corrector to be used with SoftAudioPusher. + * + * @author Karl Helgason + */ +public class SoftJitterCorrector extends AudioInputStream { + + private static class JitterStream extends InputStream { + + static int MAX_BUFFER_SIZE = 1048576; + boolean active = true; + Thread thread; + AudioInputStream stream; + // Cyclic buffer + int writepos = 0; + int readpos = 0; + byte[][] buffers; + Object buffers_mutex = new Object(); + + // Adapative Drift Statistics + int w_count = 1000; + int w_min_tol = 2; + int w_max_tol = 10; + int w = 0; + int w_min = -1; + // Current read buffer + int bbuffer_pos = 0; + int bbuffer_max = 0; + byte[] bbuffer = null; + + public byte[] nextReadBuffer() { + synchronized (buffers_mutex) { + if (writepos > readpos) { + int w_m = writepos - readpos; + if (w_m < w_min) + w_min = w_m; + + int buffpos = readpos; + readpos++; + return buffers[buffpos % buffers.length]; + } + w_min = -1; + w = w_count - 1; + } + while (true) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + //e.printStackTrace(); + return null; + } + synchronized (buffers_mutex) { + if (writepos > readpos) { + w = 0; + w_min = -1; + w = w_count - 1; + int buffpos = readpos; + readpos++; + return buffers[buffpos % buffers.length]; + } + } + } + } + + public byte[] nextWriteBuffer() { + synchronized (buffers_mutex) { + return buffers[writepos % buffers.length]; + } + } + + public void commit() { + synchronized (buffers_mutex) { + writepos++; + if ((writepos - readpos) > buffers.length) { + int newsize = (writepos - readpos) + 10; + newsize = Math.max(buffers.length * 2, newsize); + buffers = new byte[newsize][buffers[0].length]; + } + } + } + + public JitterStream(AudioInputStream s, int buffersize, + int smallbuffersize) { + this.w_count = 10 * (buffersize / smallbuffersize); + if (w_count < 100) + w_count = 100; + this.buffers + = new byte[(buffersize/smallbuffersize)+10][smallbuffersize]; + this.bbuffer_max = MAX_BUFFER_SIZE / smallbuffersize; + this.stream = s; + + + Runnable runnable = new Runnable() { + + public void run() { + AudioFormat format = stream.getFormat(); + int bufflen = buffers[0].length; + int frames = bufflen / format.getFrameSize(); + long nanos = (long) (frames * 1000000000.0 + / format.getSampleRate()); + long now = System.nanoTime(); + long next = now + nanos; + int correction = 0; + while (true) { + synchronized (JitterStream.this) { + if (!active) + break; + } + int curbuffsize; + synchronized (buffers) { + curbuffsize = writepos - readpos; + if (correction == 0) { + w++; + if (w_min != Integer.MAX_VALUE) { + if (w == w_count) { + correction = 0; + if (w_min < w_min_tol) { + correction = (w_min_tol + w_max_tol) + / 2 - w_min; + } + if (w_min > w_max_tol) { + correction = (w_min_tol + w_max_tol) + / 2 - w_min; + } + w = 0; + w_min = Integer.MAX_VALUE; + } + } + } + } + while (curbuffsize > bbuffer_max) { + synchronized (buffers) { + curbuffsize = writepos - readpos; + } + synchronized (JitterStream.this) { + if (!active) + break; + } + try { + Thread.sleep(1); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + } + + if (correction < 0) + correction++; + else { + byte[] buff = nextWriteBuffer(); + try { + int n = 0; + while (n != buff.length) { + int s = stream.read(buff, n, buff.length + - n); + if (s < 0) + throw new EOFException(); + if (s == 0) + Thread.yield(); + n += s; + } + } catch (IOException e1) { + //e1.printStackTrace(); + } + commit(); + } + + if (correction > 0) { + correction--; + next = System.nanoTime() + nanos; + continue; + } + long wait = next - System.nanoTime(); + if (wait > 0) { + try { + Thread.sleep(wait / 1000000L); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + } + next += nanos; + } + } + }; + + thread = new Thread(runnable); + thread.setPriority(Thread.MAX_PRIORITY); + thread.start(); + } + + public void close() throws IOException { + synchronized (this) { + active = false; + } + try { + thread.join(); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + stream.close(); + } + + public int read() throws IOException { + byte[] b = new byte[1]; + if (read(b) == -1) + return -1; + return b[0] & 0xFF; + } + + public void fillBuffer() { + bbuffer = nextReadBuffer(); + bbuffer_pos = 0; + } + + public int read(byte[] b, int off, int len) { + if (bbuffer == null) + fillBuffer(); + int bbuffer_len = bbuffer.length; + int offlen = off + len; + while (off < offlen) { + if (available() == 0) + fillBuffer(); + else { + byte[] bbuffer = this.bbuffer; + int bbuffer_pos = this.bbuffer_pos; + while (off < offlen && bbuffer_pos < bbuffer_len) + b[off++] = bbuffer[bbuffer_pos++]; + this.bbuffer_pos = bbuffer_pos; + } + } + return len; + } + + public int available() { + return bbuffer.length - bbuffer_pos; + } + } + + public SoftJitterCorrector(AudioInputStream stream, int buffersize, + int smallbuffersize) { + super(new JitterStream(stream, buffersize, smallbuffersize), + stream.getFormat(), stream.getFrameLength()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftLanczosResampler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLanczosResampler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,118 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Lanczos interpolation resampler. + * + * @author Karl Helgason + */ +public class SoftLanczosResampler extends SoftAbstractResampler { + + float[][] sinc_table; + int sinc_table_fsize = 2000; + int sinc_table_size = 5; + int sinc_table_center = sinc_table_size / 2; + + public SoftLanczosResampler() { + super(); + sinc_table = new float[sinc_table_fsize][]; + for (int i = 0; i < sinc_table_fsize; i++) { + sinc_table[i] = sincTable(sinc_table_size, -i + / ((float) sinc_table_fsize)); + } + } + + // Normalized sinc function + public static double sinc(double x) { + return (x == 0.0) ? 1.0 : Math.sin(Math.PI * x) / (Math.PI * x); + } + + // Generate sinc table + public static float[] sincTable(int size, float offset) { + int center = size / 2; + float[] w = new float[size]; + for (int k = 0; k < size; k++) { + float x = (-center + k + offset); + if (x < -2 || x > 2) + w[k] = 0; + else if (x == 0) + w[k] = 1; + else { + w[k] = (float)(2.0 * Math.sin(Math.PI * x) + * Math.sin(Math.PI * x / 2.0) + / ((Math.PI * x) * (Math.PI * x))); + } + } + return w; + } + + public int getPadding() // must be at least half of sinc_table_size + { + return sinc_table_size / 2 + 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + + if (pitchstep == 0) { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float[] sinc_table + = this.sinc_table[(int) ((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float[] sinc_table + = this.sinc_table[(int) ((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,191 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A simple look-ahead volume limiter with very fast attack and fast release. + * This filter is used for preventing clipping. + * + * @author Karl Helgason + */ +public class SoftLimiter implements SoftAudioProcessor { + + float lastmax = 0; + float gain = 1; + float[] temp_bufferL; + float[] temp_bufferR; + boolean mix = false; + SoftAudioBuffer bufferL; + SoftAudioBuffer bufferR; + SoftAudioBuffer bufferLout; + SoftAudioBuffer bufferRout; + float controlrate; + + public void init(float samplerate, float controlrate) { + this.controlrate = controlrate; + } + + public void setInput(int pin, SoftAudioBuffer input) { + if (pin == 0) + bufferL = input; + if (pin == 1) + bufferR = input; + } + + public void setOutput(int pin, SoftAudioBuffer output) { + if (pin == 0) + bufferLout = output; + if (pin == 1) + bufferRout = output; + } + + public void setMixMode(boolean mix) { + this.mix = mix; + } + + public void globalParameterControlChange(int[] slothpath, long param, + long value) { + } + + double silentcounter = 0; + + public void processAudio() { + if (this.bufferL.isSilent() + && (this.bufferR == null || this.bufferR.isSilent())) { + silentcounter += 1 / controlrate; + + if (silentcounter > 60) { + if (!mix) { + bufferLout.clear(); + bufferRout.clear(); + } + return; + } + } else + silentcounter = 0; + + float[] bufferL = this.bufferL.array(); + float[] bufferR = this.bufferR == null ? null : this.bufferR.array(); + float[] bufferLout = this.bufferLout.array(); + float[] bufferRout = this.bufferRout == null + ? null : this.bufferRout.array(); + + if (temp_bufferL == null || temp_bufferL.length < bufferL.length) + temp_bufferL = new float[bufferL.length]; + if (bufferR != null) + if (temp_bufferR == null || temp_bufferR.length < bufferR.length) + temp_bufferR = new float[bufferR.length]; + + float max = 0; + int len = bufferL.length; + + if (bufferR == null) { + for (int i = 0; i < len; i++) { + if (bufferL[i] > max) + max = bufferL[i]; + if (-bufferL[i] > max) + max = -bufferL[i]; + } + } else { + for (int i = 0; i < len; i++) { + if (bufferL[i] > max) + max = bufferL[i]; + if (bufferR[i] > max) + max = bufferR[i]; + if (-bufferL[i] > max) + max = -bufferL[i]; + if (-bufferR[i] > max) + max = -bufferR[i]; + } + } + + float lmax = lastmax; + lastmax = max; + if (lmax > max) + max = lmax; + + float newgain = 1; + if (max > 0.99f) + newgain = 0.99f / max; + else + newgain = 1; + + if (newgain > gain) + newgain = (newgain + gain * 9) / 10f; + + float gaindelta = (newgain - gain) / len; + if (mix) { + if (bufferR == null) { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float tL = temp_bufferL[i]; + temp_bufferL[i] = bL; + bufferLout[i] += tL * gain; + } + } else { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float bR = bufferR[i]; + float tL = temp_bufferL[i]; + float tR = temp_bufferR[i]; + temp_bufferL[i] = bL; + temp_bufferR[i] = bR; + bufferLout[i] += tL * gain; + bufferRout[i] += tR * gain; + } + } + + } else { + if (bufferR == null) { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float tL = temp_bufferL[i]; + temp_bufferL[i] = bL; + bufferLout[i] = tL * gain; + } + } else { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float bR = bufferR[i]; + float tL = temp_bufferL[i]; + float tR = temp_bufferR[i]; + temp_bufferL[i] = bL; + temp_bufferR[i] = bR; + bufferLout[i] = tL * gain; + bufferRout[i] = tR * gain; + } + } + + } + gain = newgain; + } + + public void processControlLogic() { + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses first-order (linear) interpolation. + * + * @author Karl Helgason + */ +public class SoftLinearResampler extends SoftAbstractResampler { + + public int getPadding() { + return 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler2.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,108 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses first-order (linear) interpolation. + * + * This one doesn't perform float to int casting inside the processing loop. + * + * @author Karl Helgason + */ +public class SoftLinearResampler2 extends SoftAbstractResampler { + + public int getPadding() { + return 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + + // Check if we have do anything + if (!(ix < ix_end && ox < ox_end)) + return; + + // 15 bit shift was choosed because + // it resulted in no drift between p_ix and ix. + int p_ix = (int) (ix * (1 << 15)); + int p_ix_end = (int) (ix_end * (1 << 15)); + int p_pitch = (int) (pitch * (1 << 15)); + // Pitch needs to recalculated + // to ensure no drift between p_ix and ix. + pitch = p_pitch * (1f / (1 << 15)); + + if (pitchstep == 0f) { + + // To reduce + // while (p_ix < p_ix_end && ox < ox_end) + // into + // while (ox < ox_end) + // We need to calculate new ox_end value. + int p_ix_len = p_ix_end - p_ix; + int p_mod = p_ix_len % p_pitch; + if (p_mod != 0) + p_ix_len += p_pitch - p_mod; + int ox_end2 = ox + p_ix_len / p_pitch; + if (ox_end2 < ox_end) + ox_end = ox_end2; + + while (ox < ox_end) { + int iix = p_ix >> 15; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + p_ix += p_pitch; + ix += pitch; + } + + } else { + + int p_pitchstep = (int) (pitchstep * (1 << 15)); + pitchstep = p_pitchstep * (1f / (1 << 15)); + + while (p_ix < p_ix_end && ox < ox_end) { + int iix = p_ix >> 15; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + ix += pitch; + p_ix += p_pitch; + pitch += pitchstep; + p_pitch += p_pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,122 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * LFO control signal generator. + * + * @author Karl Helgason + */ +public class SoftLowFrequencyOscillator implements SoftProcess { + + private int max_count = 10; + private int used_count = 0; + private double[][] out = new double[max_count][1]; + private double[][] delay = new double[max_count][1]; + private double[][] delay2 = new double[max_count][1]; + private double[][] freq = new double[max_count][1]; + private int[] delay_counter = new int[max_count]; + private double[] sin_phase = new double[max_count]; + private double[] sin_stepfreq = new double[max_count]; + private double[] sin_step = new double[max_count]; + private double control_time = 0; + private double sin_factor = 0; + private static double PI2 = 2.0 * Math.PI; + + public void reset() { + for (int i = 0; i < used_count; i++) { + out[i][0] = 0; + delay[i][0] = 0; + delay2[i][0] = 0; + freq[i][0] = 0; + delay_counter[i] = 0; + sin_phase[i] = 0; + sin_stepfreq[i] = 0; + sin_step[i] = 0; + } + used_count = 0; + } + + public void init(SoftSynthesizer synth) { + control_time = 1.0 / synth.getControlRate(); + sin_factor = control_time * 2 * Math.PI; + for (int i = 0; i < used_count; i++) { + delay_counter[i] = (int)(Math.pow(2, + this.delay[i][0] / 1200.0) / control_time); + delay_counter[i] += (int)(delay2[i][0] / (control_time * 1000)); + } + processControlLogic(); + } + + public void processControlLogic() { + for (int i = 0; i < used_count; i++) { + if (delay_counter[i] > 0) { + delay_counter[i]--; + out[i][0] = 0.5; + } else { + double f = freq[i][0]; + + if (sin_stepfreq[i] != f) { + sin_stepfreq[i] = f; + double fr = 440.0 * Math.exp( + (f - 6900.0) * (Math.log(2) / 1200.0)); + sin_step[i] = fr * sin_factor; + } + /* + double fr = 440.0 * Math.pow(2.0, + (freq[i][0] - 6900.0) / 1200.0); + sin_phase[i] += fr * sin_factor; + */ + /* + sin_phase[i] += sin_step[i]; + while (sin_phase[i] > PI2) + sin_phase[i] -= PI2; + out[i][0] = 0.5 + Math.sin(sin_phase[i]) * 0.5; + */ + double p = sin_phase[i]; + p += sin_step[i]; + while (p > PI2) + p -= PI2; + out[i][0] = 0.5 + Math.sin(p) * 0.5; + sin_phase[i] = p; + + } + } + } + + public double[] get(int instance, String name) { + if (instance >= used_count) + used_count = instance + 1; + if (name == null) + return out[instance]; + if (name.equals("delay")) + return delay[instance]; + if (name.equals("delay2")) + return delay2[instance]; + if (name.equals("freq")) + return freq[instance]; + return null; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,982 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.TreeMap; +import java.util.Map.Entry; + +import javax.sound.midi.MidiMessage; +import javax.sound.midi.Patch; +import javax.sound.midi.ShortMessage; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +/** + * Software synthesizer main audio mixer. + * + * @author Karl Helgason + */ +public class SoftMainMixer { + + public final static int CHANNEL_LEFT = 0; + public final static int CHANNEL_RIGHT = 1; + public final static int CHANNEL_EFFECT1 = 2; + public final static int CHANNEL_EFFECT2 = 3; + public final static int CHANNEL_EFFECT3 = 4; + public final static int CHANNEL_EFFECT4 = 5; + public final static int CHANNEL_LEFT_DRY = 10; + public final static int CHANNEL_RIGHT_DRY = 11; + public final static int CHANNEL_SCRATCH1 = 12; + public final static int CHANNEL_SCRATCH2 = 13; + public final static int CHANNEL_CHANNELMIXER_LEFT = 14; + public final static int CHANNEL_CHANNELMIXER_RIGHT = 15; + protected boolean active_sensing_on = false; + private long msec_last_activity = -1; + private boolean pusher_silent = false; + private int pusher_silent_count = 0; + private long msec_pos = 0; + protected boolean readfully = true; + private Object control_mutex; + private SoftSynthesizer synth; + private int nrofchannels = 2; + private SoftVoice[] voicestatus = null; + private SoftAudioBuffer[] buffers; + private SoftReverb reverb; + private SoftAudioProcessor chorus; + private SoftAudioProcessor agc; + private long msec_buffer_len = 0; + protected TreeMap midimessages = new TreeMap(); + double last_volume_left = 1.0; + double last_volume_right = 1.0; + private double[] co_master_balance = new double[1]; + private double[] co_master_volume = new double[1]; + private double[] co_master_coarse_tuning = new double[1]; + private double[] co_master_fine_tuning = new double[1]; + private AudioInputStream ais; + private Set registeredMixers = null; + private Set stoppedMixers = null; + private ModelChannelMixer[] cur_registeredMixers = null; + protected SoftControl co_master = new SoftControl() { + + double[] balance = co_master_balance; + double[] volume = co_master_volume; + double[] coarse_tuning = co_master_coarse_tuning; + double[] fine_tuning = co_master_fine_tuning; + + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("balance")) + return balance; + if (name.equals("volume")) + return volume; + if (name.equals("coarse_tuning")) + return coarse_tuning; + if (name.equals("fine_tuning")) + return fine_tuning; + return null; + } + }; + + private void processSystemExclusiveMessage(byte[] data) { + synchronized (synth.control_mutex) { + activity(); + + // Universal Non-Real-Time SysEx + if ((data[1] & 0xFF) == 0x7E) { + int deviceID = data[2] & 0xFF; + if (deviceID == 0x7F || deviceID == synth.getDeviceID()) { + int subid1 = data[3] & 0xFF; + int subid2; + switch (subid1) { + case 0x08: // MIDI Tuning Standard + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // BULK TUNING DUMP + { + // http://www.midi.org/about-midi/tuning.shtml + SoftTuning tuning = synth.getTuning(new Patch(0, + data[5] & 0xFF)); + tuning.load(data); + break; + } + case 0x04: // KEY-BASED TUNING DUMP + case 0x05: // SCALE/OCTAVE TUNING DUMP, 1 byte format + case 0x06: // SCALE/OCTAVE TUNING DUMP, 2 byte format + case 0x07: // SINGLE NOTE TUNING CHANGE (NON REAL-TIME) + // (BANK) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + SoftTuning tuning = synth.getTuning(new Patch( + data[5] & 0xFF, data[6] & 0xFF)); + tuning.load(data); + break; + } + case 0x08: // scale/octave tuning 1-byte form (Non + // Real-Time) + case 0x09: // scale/octave tuning 2-byte form (Non + // Real-Time) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + SoftTuning tuning = new SoftTuning(data); + int channelmask = (data[5] & 0xFF) * 16384 + + (data[6] & 0xFF) * 128 + (data[7] & 0xFF); + SoftChannel[] channels = synth.channels; + for (int i = 0; i < channels.length; i++) + if ((channelmask & (1 << i)) != 0) + channels[i].tuning = tuning; + break; + } + default: + break; + } + break; + case 0x09: // General Midi Message + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // General Midi 1 On + synth.setGeneralMidiMode(1); + reset(); + break; + case 0x02: // General Midi Off + synth.setGeneralMidiMode(0); + reset(); + break; + case 0x03: // General MidI Level 2 On + synth.setGeneralMidiMode(2); + reset(); + break; + default: + break; + } + break; + case 0x0A: // DLS Message + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // DLS On + if (synth.getGeneralMidiMode() == 0) + synth.setGeneralMidiMode(1); + synth.voice_allocation_mode = 1; + reset(); + break; + case 0x02: // DLS Off + synth.setGeneralMidiMode(0); + synth.voice_allocation_mode = 0; + reset(); + break; + case 0x03: // DLS Static Voice Allocation Off + synth.voice_allocation_mode = 0; + break; + case 0x04: // DLS Static Voice Allocation On + synth.voice_allocation_mode = 1; + break; + default: + break; + } + break; + + default: + break; + } + } + } + + // Universal Real-Time SysEx + if ((data[1] & 0xFF) == 0x7F) { + int deviceID = data[2] & 0xFF; + if (deviceID == 0x7F || deviceID == synth.getDeviceID()) { + int subid1 = data[3] & 0xFF; + int subid2; + switch (subid1) { + case 0x04: // Device Control + + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // Master Volume + case 0x02: // Master Balane + case 0x03: // Master fine tuning + case 0x04: // Master coarse tuning + int val = (data[5] & 0x7F) + + ((data[6] & 0x7F) * 128); + if (subid2 == 0x01) + setVolume(val); + else if (subid2 == 0x02) + setBalance(val); + else if (subid2 == 0x03) + setFineTuning(val); + else if (subid2 == 0x04) + setCoarseTuning(val); + break; + case 0x05: // Global Parameter Control + int ix = 5; + int slotPathLen = (data[ix++] & 0xFF); + int paramWidth = (data[ix++] & 0xFF); + int valueWidth = (data[ix++] & 0xFF); + int[] slotPath = new int[slotPathLen]; + for (int i = 0; i < slotPathLen; i++) { + int msb = (data[ix++] & 0xFF); + int lsb = (data[ix++] & 0xFF); + slotPath[i] = msb * 128 + lsb; + } + int paramCount = (data.length - 1 - ix) + / (paramWidth + valueWidth); + long[] params = new long[paramCount]; + long[] values = new long[paramCount]; + for (int i = 0; i < paramCount; i++) { + values[i] = 0; + for (int j = 0; j < paramWidth; j++) + params[i] = params[i] * 128 + + (data[ix++] & 0xFF); + for (int j = 0; j < valueWidth; j++) + values[i] = values[i] * 128 + + (data[ix++] & 0xFF); + + } + globalParameterControlChange(slotPath, params, values); + break; + default: + break; + } + break; + + case 0x08: // MIDI Tuning Standard + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x02: // SINGLE NOTE TUNING CHANGE (REAL-TIME) + { + // http://www.midi.org/about-midi/tuning.shtml + SoftTuning tuning = synth.getTuning(new Patch(0, + data[5] & 0xFF)); + tuning.load(data); + SoftVoice[] voices = synth.getVoices(); + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + if (voices[i].tuning == tuning) + voices[i].updateTuning(tuning); + break; + } + case 0x07: // SINGLE NOTE TUNING CHANGE (REAL-TIME) + // (BANK) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + SoftTuning tuning = synth.getTuning(new Patch( + data[5] & 0xFF, data[6] & 0xFF)); + tuning.load(data); + SoftVoice[] voices = synth.getVoices(); + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + if (voices[i].tuning == tuning) + voices[i].updateTuning(tuning); + break; + } + case 0x08: // scale/octave tuning 1-byte form + //(Real-Time) + case 0x09: // scale/octave tuning 2-byte form + // (Real-Time) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + SoftTuning tuning = new SoftTuning(data); + int channelmask = (data[5] & 0xFF) * 16384 + + (data[6] & 0xFF) * 128 + (data[7] & 0xFF); + SoftChannel[] channels = synth.channels; + for (int i = 0; i < channels.length; i++) + if ((channelmask & (1 << i)) != 0) + channels[i].tuning = tuning; + SoftVoice[] voices = synth.getVoices(); + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + if ((channelmask & (1 << (voices[i].channel))) != 0) + voices[i].updateTuning(tuning); + break; + } + default: + break; + } + break; + case 0x09: // Control Destination Settings + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // Channel Pressure + { + int[] destinations = new int[(data.length - 7) / 2]; + int[] ranges = new int[(data.length - 7) / 2]; + int ix = 0; + for (int j = 6; j < data.length - 1; j += 2) { + destinations[ix] = data[j] & 0xFF; + ranges[ix] = data[j + 1] & 0xFF; + ix++; + } + int channel = data[5] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + softchannel.mapChannelPressureToDestination( + destinations, ranges); + break; + } + case 0x02: // Poly Pressure + { + int[] destinations = new int[(data.length - 7) / 2]; + int[] ranges = new int[(data.length - 7) / 2]; + int ix = 0; + for (int j = 6; j < data.length - 1; j += 2) { + destinations[ix] = data[j] & 0xFF; + ranges[ix] = data[j + 1] & 0xFF; + ix++; + } + int channel = data[5] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + softchannel.mapPolyPressureToDestination( + destinations, ranges); + break; + } + case 0x03: // Control Change + { + int[] destinations = new int[(data.length - 7) / 2]; + int[] ranges = new int[(data.length - 7) / 2]; + int ix = 0; + for (int j = 7; j < data.length - 1; j += 2) { + destinations[ix] = data[j] & 0xFF; + ranges[ix] = data[j + 1] & 0xFF; + ix++; + } + int channel = data[5] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + int control = data[6] & 0xFF; + softchannel.mapControlToDestination(control, + destinations, ranges); + break; + } + default: + break; + } + break; + + case 0x0A: // Key Based Instrument Control + { + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // Basic Message + int channel = data[5] & 0xFF; + int keynumber = data[6] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + for (int j = 7; j < data.length - 1; j += 2) { + int controlnumber = data[j] & 0xFF; + int controlvalue = data[j + 1] & 0xFF; + softchannel.controlChangePerNote(keynumber, + controlnumber, controlvalue); + } + break; + default: + break; + } + break; + } + default: + break; + } + } + } + + } + } + + private void processMessages(long timeStamp) { + Iterator> iter = midimessages.entrySet().iterator(); + while (iter.hasNext()) { + Entry entry = iter.next(); + if (entry.getKey() > (timeStamp + 100)) + return; + processMessage(entry.getValue()); + iter.remove(); + } + } + + protected void processAudioBuffers() { + for (int i = 0; i < buffers.length; i++) { + buffers[i].clear(); + } + + double volume_left; + double volume_right; + + ModelChannelMixer[] act_registeredMixers; + + // perform control logic + synchronized (control_mutex) { + + processMessages(msec_pos); + + if (active_sensing_on) { + // Active Sensing + // if no message occurs for max 1000 ms + // then do AllSoundOff on all channels + if ((msec_pos - msec_last_activity) > 1000000) { + active_sensing_on = false; + for (SoftChannel c : synth.channels) + c.allSoundOff(); + } + + } + + for (int i = 0; i < voicestatus.length; i++) + if (voicestatus[i].active) + voicestatus[i].processControlLogic(); + msec_pos += msec_buffer_len; + + double volume = co_master_volume[0]; + volume_left = volume; + volume_right = volume; + + double balance = co_master_balance[0]; + if (balance > 0.5) + volume_left *= (1 - balance) * 2; + else + volume_right *= balance * 2; + + chorus.processControlLogic(); + reverb.processControlLogic(); + agc.processControlLogic(); + + if (cur_registeredMixers == null) { + if (registeredMixers != null) { + cur_registeredMixers = + new ModelChannelMixer[registeredMixers.size()]; + registeredMixers.toArray(cur_registeredMixers); + } + } + + act_registeredMixers = cur_registeredMixers; + if (act_registeredMixers != null) + if (act_registeredMixers.length == 0) + act_registeredMixers = null; + + } + + if (act_registeredMixers != null) { + + // Reroute default left,right output + // to channelmixer left,right input/output + SoftAudioBuffer leftbak = buffers[CHANNEL_LEFT]; + SoftAudioBuffer rightbak = buffers[CHANNEL_RIGHT]; + buffers[CHANNEL_LEFT] = buffers[CHANNEL_CHANNELMIXER_LEFT]; + buffers[CHANNEL_RIGHT] = buffers[CHANNEL_CHANNELMIXER_LEFT]; + + int bufferlen = buffers[CHANNEL_LEFT].getSize(); + + float[][] cbuffer = new float[nrofchannels][]; + cbuffer[0] = buffers[CHANNEL_LEFT].array(); + if (nrofchannels != 1) + cbuffer[1] = buffers[CHANNEL_RIGHT].array(); + + float[][] obuffer = new float[nrofchannels][]; + obuffer[0] = leftbak.array(); + if (nrofchannels != 1) + obuffer[1] = rightbak.array(); + + for (ModelChannelMixer cmixer : act_registeredMixers) { + for (int i = 0; i < cbuffer.length; i++) + Arrays.fill(cbuffer[i], 0); + boolean hasactivevoices = false; + for (int i = 0; i < voicestatus.length; i++) + if (voicestatus[i].active) + if (voicestatus[i].channelmixer == cmixer) { + voicestatus[i].processAudioLogic(buffers); + hasactivevoices = true; + } + if (!cmixer.process(cbuffer, 0, bufferlen)) { + synchronized (control_mutex) { + registeredMixers.remove(cmixer); + cur_registeredMixers = null; + } + } + + for (int i = 0; i < cbuffer.length; i++) { + float[] cbuff = cbuffer[i]; + float[] obuff = obuffer[i]; + for (int j = 0; j < bufferlen; j++) + obuff[j] += cbuff[j]; + } + + if (!hasactivevoices) { + synchronized (control_mutex) { + if (stoppedMixers != null) { + if (stoppedMixers.contains(cmixer)) { + stoppedMixers.remove(cmixer); + cmixer.stop(); + } + } + } + } + + } + + buffers[CHANNEL_LEFT] = leftbak; + buffers[CHANNEL_RIGHT] = rightbak; + + } + + for (int i = 0; i < voicestatus.length; i++) + if (voicestatus[i].active) + if (voicestatus[i].channelmixer == null) + voicestatus[i].processAudioLogic(buffers); + + // Run effects + if (synth.chorus_on) + chorus.processAudio(); + + if (synth.reverb_on) + reverb.processAudio(); + + if (nrofchannels == 1) + volume_left = (volume_left + volume_right) / 2; + + // Set Volume / Balance + if (last_volume_left != volume_left || last_volume_right != volume_right) { + float[] left = buffers[CHANNEL_LEFT].array(); + float[] right = buffers[CHANNEL_RIGHT].array(); + int bufferlen = buffers[CHANNEL_LEFT].getSize(); + + float amp; + float amp_delta; + amp = (float)(last_volume_left * last_volume_left); + amp_delta = (float)((volume_left * volume_left - amp) / bufferlen); + for (int i = 0; i < bufferlen; i++) { + amp += amp_delta; + left[i] *= amp; + } + if (nrofchannels != 1) { + amp = (float)(last_volume_right * last_volume_right); + amp_delta = (float)((volume_right*volume_right - amp) / bufferlen); + for (int i = 0; i < bufferlen; i++) { + amp += amp_delta; + right[i] *= volume_right; + } + } + last_volume_left = volume_left; + last_volume_right = volume_right; + + } else { + if (volume_left != 1.0 || volume_right != 1.0) { + float[] left = buffers[CHANNEL_LEFT].array(); + float[] right = buffers[CHANNEL_RIGHT].array(); + int bufferlen = buffers[CHANNEL_LEFT].getSize(); + float amp; + amp = (float) (volume_left * volume_left); + for (int i = 0; i < bufferlen; i++) + left[i] *= amp; + if (nrofchannels != 1) { + amp = (float)(volume_right * volume_right); + for (int i = 0; i < bufferlen; i++) + right[i] *= amp; + } + + } + } + + if(buffers[CHANNEL_LEFT].isSilent() + && buffers[CHANNEL_RIGHT].isSilent()) + { + pusher_silent_count++; + if(pusher_silent_count > 5) + { + pusher_silent_count = 0; + synchronized (control_mutex) { + pusher_silent = true; + if(synth.weakstream != null) + synth.weakstream.setInputStream(null); + } + } + } + else + pusher_silent_count = 0; + + if (synth.agc_on) + agc.processAudio(); + + } + + // Must only we called within control_mutex synchronization + public void activity() + { + msec_last_activity = msec_pos; + if(pusher_silent) + { + pusher_silent = false; + if(synth.weakstream != null) + synth.weakstream.setInputStream(ais); + } + } + + public void stopMixer(ModelChannelMixer mixer) { + if (stoppedMixers == null) + stoppedMixers = new HashSet(); + stoppedMixers.add(mixer); + } + + public void registerMixer(ModelChannelMixer mixer) { + if (registeredMixers == null) + registeredMixers = new HashSet(); + registeredMixers.add(mixer); + cur_registeredMixers = null; + } + + public SoftMainMixer(SoftSynthesizer synth) { + this.synth = synth; + + msec_pos = 0; + + co_master_balance[0] = 0.5; + co_master_volume[0] = 1; + co_master_coarse_tuning[0] = 0.5; + co_master_fine_tuning[0] = 0.5; + + msec_buffer_len = (long) (1000000.0 / synth.getControlRate()); + + nrofchannels = synth.getFormat().getChannels(); + + int buffersize = (int) (synth.getFormat().getSampleRate() + / synth.getControlRate()); + + control_mutex = synth.control_mutex; + buffers = new SoftAudioBuffer[16]; + for (int i = 0; i < buffers.length; i++) { + buffers[i] = new SoftAudioBuffer(buffersize, synth.getFormat()); + } + voicestatus = synth.getVoices(); + + reverb = new SoftReverb(); + chorus = new SoftChorus(); + agc = new SoftLimiter(); + + float samplerate = synth.getFormat().getSampleRate(); + float controlrate = synth.getControlRate(); + reverb.init(samplerate, controlrate); + chorus.init(samplerate, controlrate); + agc.init(samplerate, controlrate); + + reverb.setLightMode(synth.reverb_light); + + reverb.setMixMode(true); + chorus.setMixMode(true); + agc.setMixMode(false); + + chorus.setInput(0, buffers[CHANNEL_EFFECT2]); + chorus.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + chorus.setOutput(1, buffers[CHANNEL_RIGHT]); + chorus.setOutput(2, buffers[CHANNEL_EFFECT1]); + + reverb.setInput(0, buffers[CHANNEL_EFFECT1]); + reverb.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + reverb.setOutput(1, buffers[CHANNEL_RIGHT]); + + agc.setInput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setInput(1, buffers[CHANNEL_RIGHT]); + agc.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setOutput(1, buffers[CHANNEL_RIGHT]); + + InputStream in = new InputStream() { + + private SoftAudioBuffer[] buffers = SoftMainMixer.this.buffers; + private int nrofchannels + = SoftMainMixer.this.synth.getFormat().getChannels(); + private int buffersize = buffers[0].getSize(); + private byte[] bbuffer = new byte[buffersize + * (SoftMainMixer.this.synth.getFormat() + .getSampleSizeInBits() / 8) + * nrofchannels]; + private int bbuffer_pos = 0; + private byte[] single = new byte[1]; + + public void fillBuffer() { + /* + boolean pusher_silent2; + synchronized (control_mutex) { + pusher_silent2 = pusher_silent; + } + if(!pusher_silent2)*/ + processAudioBuffers(); + for (int i = 0; i < nrofchannels; i++) + buffers[i].get(bbuffer, i); + bbuffer_pos = 0; + } + + public int read(byte[] b, int off, int len) { + int bbuffer_len = bbuffer.length; + int offlen = off + len; + int orgoff = off; + byte[] bbuffer = this.bbuffer; + while (off < offlen) { + if (available() == 0) + fillBuffer(); + else { + int bbuffer_pos = this.bbuffer_pos; + while (off < offlen && bbuffer_pos < bbuffer_len) + b[off++] = bbuffer[bbuffer_pos++]; + this.bbuffer_pos = bbuffer_pos; + if (!readfully) + return off - orgoff; + } + } + return len; + } + + public int read() throws IOException { + int ret = read(single); + if (ret == -1) + return -1; + return single[0] & 0xFF; + } + + public int available() { + return bbuffer.length - bbuffer_pos; + } + + public void close() { + SoftMainMixer.this.synth.close(); + } + }; + + ais = new AudioInputStream(in, synth.getFormat(), AudioSystem.NOT_SPECIFIED); + + } + + public AudioInputStream getInputStream() { + return ais; + } + + public void reset() { + + SoftChannel[] channels = synth.channels; + for (int i = 0; i < channels.length; i++) { + channels[i].allSoundOff(); + channels[i].resetAllControllers(true); + + if (synth.getGeneralMidiMode() == 2) { + if (i == 9) + channels[i].programChange(0, 0x78 * 128); + else + channels[i].programChange(0, 0x79 * 128); + } else + channels[i].programChange(0, 0); + } + setVolume(0x7F * 128 + 0x7F); + setBalance(0x40 * 128 + 0x00); + setCoarseTuning(0x40 * 128 + 0x00); + setFineTuning(0x40 * 128 + 0x00); + // Reset Reverb + globalParameterControlChange( + new int[]{0x01 * 128 + 0x01}, new long[]{0}, new long[]{4}); + // Reset Chorus + globalParameterControlChange( + new int[]{0x01 * 128 + 0x02}, new long[]{0}, new long[]{2}); + } + + public void setVolume(int value) { + synchronized (control_mutex) { + co_master_volume[0] = value / 16384.0; + } + } + + public void setBalance(int value) { + synchronized (control_mutex) { + co_master_balance[0] = value / 16384.0; + } + } + + public void setFineTuning(int value) { + synchronized (control_mutex) { + co_master_fine_tuning[0] = value / 16384.0; + } + } + + public void setCoarseTuning(int value) { + synchronized (control_mutex) { + co_master_coarse_tuning[0] = value / 16384.0; + } + } + + public int getVolume() { + synchronized (control_mutex) { + return (int) (co_master_volume[0] * 16384.0); + } + } + + public int getBalance() { + synchronized (control_mutex) { + return (int) (co_master_balance[0] * 16384.0); + } + } + + public int getFineTuning() { + synchronized (control_mutex) { + return (int) (co_master_fine_tuning[0] * 16384.0); + } + } + + public int getCoarseTuning() { + synchronized (control_mutex) { + return (int) (co_master_coarse_tuning[0] * 16384.0); + } + } + + public void globalParameterControlChange(int[] slothpath, long[] params, + long[] paramsvalue) { + if (slothpath.length == 0) + return; + + synchronized (control_mutex) { + + // slothpath: 01xx are reserved only for GM2 + + if (slothpath[0] == 0x01 * 128 + 0x01) { + for (int i = 0; i < paramsvalue.length; i++) { + reverb.globalParameterControlChange(slothpath, params[i], + paramsvalue[i]); + } + } + if (slothpath[0] == 0x01 * 128 + 0x02) { + for (int i = 0; i < paramsvalue.length; i++) { + chorus.globalParameterControlChange(slothpath, params[i], + paramsvalue[i]); + } + + } + + } + } + + public void processMessage(Object object) { + if (object instanceof byte[]) + processMessage((byte[]) object); + if (object instanceof MidiMessage) + processMessage((MidiMessage)object); + } + + public void processMessage(MidiMessage message) { + if (message instanceof ShortMessage) { + ShortMessage sms = (ShortMessage)message; + processMessage(sms.getChannel(), sms.getCommand(), + sms.getData1(), sms.getData2()); + return; + } + processMessage(message.getMessage()); + } + + public void processMessage(byte[] data) { + int status = 0; + if (data.length > 0) + status = data[0] & 0xFF; + + if (status == 0xF0) { + processSystemExclusiveMessage(data); + return; + } + + int cmd = (status & 0xF0); + int ch = (status & 0x0F); + + int data1; + int data2; + if (data.length > 1) + data1 = data[1] & 0xFF; + else + data1 = 0; + if (data.length > 2) + data2 = data[2] & 0xFF; + else + data2 = 0; + + processMessage(ch, cmd, data1, data2); + + } + + public void processMessage(int ch, int cmd, int data1, int data2) { + synchronized (synth.control_mutex) { + activity(); + } + + if (cmd == 0xF0) { + int status = cmd | ch; + switch (status) { + case ShortMessage.ACTIVE_SENSING: + synchronized (synth.control_mutex) { + active_sensing_on = true; + } + break; + default: + break; + } + return; + } + + SoftChannel[] channels = synth.channels; + if (ch >= channels.length) + return; + SoftChannel softchannel = channels[ch]; + + switch (cmd) { + case ShortMessage.NOTE_ON: + softchannel.noteOn(data1, data2); + break; + case ShortMessage.NOTE_OFF: + softchannel.noteOff(data1, data2); + break; + case ShortMessage.POLY_PRESSURE: + softchannel.setPolyPressure(data1, data2); + break; + case ShortMessage.CONTROL_CHANGE: + softchannel.controlChange(data1, data2); + break; + case ShortMessage.PROGRAM_CHANGE: + softchannel.programChange(data1); + break; + case ShortMessage.CHANNEL_PRESSURE: + softchannel.setChannelPressure(data1); + break; + case ShortMessage.PITCH_BEND: + softchannel.setPitchBend(data1 + data2 * 128); + break; + default: + break; + } + + } + + public long getMicrosecondPosition() { + return msec_pos; + } + + public void close() { + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,214 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.MetaMessage; +import javax.sound.midi.MidiEvent; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Receiver; +import javax.sound.midi.Sequence; +import javax.sound.midi.Track; +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.UnsupportedAudioFileException; +import javax.sound.sampled.AudioFileFormat.Type; +import javax.sound.sampled.spi.AudioFileReader; + +/** + * MIDI File Audio Renderer/Reader + * + * @author Karl Helgason + */ +public class SoftMidiAudioFileReader extends AudioFileReader { + + public static final Type MIDI = new Type("MIDI", "mid"); + private static AudioFormat format = new AudioFormat(44100, 16, 2, true, false); + + public AudioFileFormat getAudioFileFormat(Sequence seq) + throws UnsupportedAudioFileException, IOException { + + long totallen = seq.getMicrosecondLength() / 1000000; + long len = (long) (format.getFrameRate() * (totallen + 4)); + return new AudioFileFormat(MIDI, format, (int) len); + } + + public AudioInputStream getAudioInputStream(Sequence seq) + throws UnsupportedAudioFileException, IOException { + AudioSynthesizer synth = (AudioSynthesizer) new SoftSynthesizer(); + AudioInputStream stream; + Receiver recv; + try { + stream = synth.openStream(format, null); + recv = synth.getReceiver(); + } catch (MidiUnavailableException e) { + throw new IOException(e.toString()); + } + float divtype = seq.getDivisionType(); + Track[] tracks = seq.getTracks(); + int[] trackspos = new int[tracks.length]; + int mpq = 500000; + int seqres = seq.getResolution(); + long lasttick = 0; + long curtime = 0; + while (true) { + MidiEvent selevent = null; + int seltrack = -1; + for (int i = 0; i < tracks.length; i++) { + int trackpos = trackspos[i]; + Track track = tracks[i]; + if (trackpos < track.size()) { + MidiEvent event = track.get(trackpos); + if (selevent == null || event.getTick() < selevent.getTick()) { + selevent = event; + seltrack = i; + } + } + } + if (seltrack == -1) + break; + trackspos[seltrack]++; + long tick = selevent.getTick(); + if (divtype == Sequence.PPQ) + curtime += ((tick - lasttick) * mpq) / seqres; + else + curtime = (long) ((tick * 1000000.0 * divtype) / seqres); + lasttick = tick; + MidiMessage msg = selevent.getMessage(); + if (msg instanceof MetaMessage) { + if (divtype == Sequence.PPQ) { + if (((MetaMessage) msg).getType() == 0x51) { + byte[] data = ((MetaMessage) msg).getData(); + mpq = ((data[0] & 0xff) << 16) + | ((data[1] & 0xff) << 8) | (data[2] & 0xff); + } + } + } else { + recv.send(msg, curtime); + } + } + + long totallen = curtime / 1000000; + long len = (long) (stream.getFormat().getFrameRate() * (totallen + 4)); + stream = new AudioInputStream(stream, stream.getFormat(), len); + return stream; + } + + public AudioInputStream getAudioInputStream(InputStream inputstream) + throws UnsupportedAudioFileException, IOException { + + inputstream.mark(200); + Sequence seq; + try { + seq = MidiSystem.getSequence(inputstream); + } catch (InvalidMidiDataException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } + return getAudioInputStream(seq); + } + + public AudioFileFormat getAudioFileFormat(URL url) + throws UnsupportedAudioFileException, IOException { + Sequence seq; + try { + seq = MidiSystem.getSequence(url); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioFileFormat(seq); + } + + public AudioFileFormat getAudioFileFormat(File file) + throws UnsupportedAudioFileException, IOException { + Sequence seq; + try { + seq = MidiSystem.getSequence(file); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioFileFormat(seq); + } + + public AudioInputStream getAudioInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + Sequence seq; + try { + seq = MidiSystem.getSequence(url); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioInputStream(seq); + } + + public AudioInputStream getAudioInputStream(File file) + throws UnsupportedAudioFileException, IOException { + if (!file.getName().toLowerCase().endsWith(".mid")) + throw new UnsupportedAudioFileException(); + Sequence seq; + try { + seq = MidiSystem.getSequence(file); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioInputStream(seq); + } + + public AudioFileFormat getAudioFileFormat(InputStream inputstream) + throws UnsupportedAudioFileException, IOException { + + inputstream.mark(200); + Sequence seq; + try { + seq = MidiSystem.getSequence(inputstream); + } catch (InvalidMidiDataException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } + return getAudioFileFormat(seq); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMixingClip.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingClip.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,539 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineUnavailableException; + +/** + * Clip implemention for the SoftMixingMixer. + * + * @author Karl Helgason + */ +public class SoftMixingClip extends SoftMixingDataLine implements Clip { + + private AudioFormat format; + + private int framesize; + + private byte[] data; + + private InputStream datastream = new InputStream() { + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b); + if (ret < 0) + return ret; + return b[0] & 0xFF; + } + + public int read(byte[] b, int off, int len) throws IOException { + + if (_loopcount != 0) { + int bloopend = _loopend * framesize; + int bloopstart = _loopstart * framesize; + int pos = _frameposition * framesize; + + if (pos + len >= bloopend) + if (pos < bloopend) { + int offend = off + len; + int o = off; + while (off != offend) { + if (pos == bloopend) { + if (_loopcount == 0) + break; + pos = bloopstart; + if (_loopcount != LOOP_CONTINUOUSLY) + _loopcount--; + } + len = offend - off; + int left = bloopend - pos; + if (len > left) + len = left; + System.arraycopy(data, pos, b, off, len); + off += len; + } + if (_loopcount == 0) { + len = offend - off; + int left = bloopend - pos; + if (len > left) + len = left; + System.arraycopy(data, pos, b, off, len); + off += len; + } + _frameposition = pos / framesize; + return o - off; + } + } + + int pos = _frameposition * framesize; + int left = bufferSize - pos; + if (left == 0) + return -1; + if (len > left) + len = left; + System.arraycopy(data, pos, b, off, len); + _frameposition += len / framesize; + return len; + } + + }; + + private int offset; + + private int bufferSize; + + private float[] readbuffer; + + private boolean open = false; + + private AudioFormat outputformat; + + private int out_nrofchannels; + + private int in_nrofchannels; + + private int frameposition = 0; + + private boolean frameposition_sg = false; + + private boolean active_sg = false; + + private int loopstart = 0; + + private int loopend = -1; + + private boolean active = false; + + private int loopcount = 0; + + private boolean _active = false; + + private int _frameposition = 0; + + private boolean loop_sg = false; + + private int _loopcount = 0; + + private int _loopstart = 0; + + private int _loopend = -1; + + private float _rightgain; + + private float _leftgain; + + private float _eff1gain; + + private float _eff2gain; + + private AudioFloatInputStream afis; + + protected SoftMixingClip(SoftMixingMixer mixer, DataLine.Info info) { + super(mixer, info); + } + + protected void processControlLogic() { + + _rightgain = rightgain; + _leftgain = leftgain; + _eff1gain = eff1gain; + _eff2gain = eff2gain; + + if (active_sg) { + _active = active; + active_sg = false; + } else { + active = _active; + } + + if (frameposition_sg) { + _frameposition = frameposition; + frameposition_sg = false; + afis = null; + } else { + frameposition = _frameposition; + } + if (loop_sg) { + _loopcount = loopcount; + _loopstart = loopstart; + _loopend = loopend; + } + + if (afis == null) { + afis = AudioFloatInputStream.getInputStream(new AudioInputStream( + datastream, format, AudioSystem.NOT_SPECIFIED)); + + if (Math.abs(format.getSampleRate() - outputformat.getSampleRate()) > 0.000001) + afis = new AudioFloatInputStreamResampler(afis, outputformat); + } + + } + + protected void processAudioLogic(SoftAudioBuffer[] buffers) { + if (_active) { + float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array(); + float[] right = buffers[SoftMixingMainMixer.CHANNEL_RIGHT].array(); + int bufferlen = buffers[SoftMixingMainMixer.CHANNEL_LEFT].getSize(); + + int readlen = bufferlen * in_nrofchannels; + if (readbuffer == null || readbuffer.length < readlen) { + readbuffer = new float[readlen]; + } + int ret = 0; + try { + ret = afis.read(readbuffer); + if (ret == -1) { + _active = false; + return; + } + if (ret != in_nrofchannels) + Arrays.fill(readbuffer, ret, readlen, 0); + } catch (IOException e) { + } + + int in_c = in_nrofchannels; + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + left[i] += readbuffer[ix] * _leftgain; + } + + if (out_nrofchannels != 1) { + if (in_nrofchannels == 1) { + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } else { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } + + } + + if (_eff1gain > 0.0002) { + + float[] eff1 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT1] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + } + } + + if (_eff2gain > 0.0002) { + float[] eff2 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT2] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + } + } + + } + } + + public int getFrameLength() { + return bufferSize / format.getFrameSize(); + } + + public long getMicrosecondLength() { + return (long) (getFrameLength() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public void loop(int count) { + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (active) + return; + active = true; + active_sg = true; + loopcount = count; + event = new LineEvent(this, LineEvent.Type.START, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + + } + + public void open(AudioInputStream stream) throws LineUnavailableException, + IOException { + if (isOpen()) { + throw new IllegalStateException("Clip is already open with format " + + getFormat() + " and frame lengh of " + getFrameLength()); + } + if (AudioFloatConverter.getConverter(stream.getFormat()) == null) + throw new IllegalArgumentException("Invalid format : " + + stream.getFormat().toString()); + + if (stream.getFrameLength() != AudioSystem.NOT_SPECIFIED) { + byte[] data = new byte[(int) stream.getFrameLength() + * stream.getFormat().getFrameSize()]; + int readsize = 512 * stream.getFormat().getFrameSize(); + int len = 0; + while (len != data.length) { + if (readsize > data.length - len) + readsize = data.length - len; + int ret = stream.read(data, len, readsize); + if (ret == -1) + break; + if (ret == 0) + Thread.yield(); + len += ret; + } + open(stream.getFormat(), data, 0, len); + } else { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] b = new byte[512 * stream.getFormat().getFrameSize()]; + int r = 0; + while ((r = stream.read(b)) != -1) { + if (r == 0) + Thread.yield(); + baos.write(b, 0, r); + } + open(stream.getFormat(), baos.toByteArray(), 0, baos.size()); + } + + } + + public void open(AudioFormat format, byte[] data, int offset, int bufferSize) + throws LineUnavailableException { + synchronized (control_mutex) { + if (isOpen()) { + throw new IllegalStateException( + "Clip is already open with format " + getFormat() + + " and frame lengh of " + getFrameLength()); + } + if (AudioFloatConverter.getConverter(format) == null) + throw new IllegalArgumentException("Invalid format : " + + format.toString()); + if (bufferSize % format.getFrameSize() != 0) + throw new IllegalArgumentException( + "Buffer size does not represent an integral number of sample frames!"); + + this.data = data; + this.offset = offset; + this.bufferSize = bufferSize; + this.format = format; + this.framesize = format.getFrameSize(); + + loopstart = 0; + loopend = -1; + loop_sg = true; + + if (!mixer.isOpen()) { + mixer.open(); + mixer.implicitOpen = true; + } + + outputformat = mixer.getFormat(); + out_nrofchannels = outputformat.getChannels(); + in_nrofchannels = format.getChannels(); + + open = true; + + mixer.getMainMixer().openLine(this); + } + + } + + public void setFramePosition(int frames) { + synchronized (control_mutex) { + frameposition_sg = true; + frameposition = frames; + } + } + + public void setLoopPoints(int start, int end) { + synchronized (control_mutex) { + if (end != -1) { + if (end < start) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + if (end * framesize > bufferSize) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + } + if (start * framesize > bufferSize) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + if (0 < start) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + loopstart = start; + loopend = end; + loop_sg = true; + } + } + + public void setMicrosecondPosition(long microseconds) { + setFramePosition((int) (microseconds * (((double) getFormat() + .getSampleRate()) / 1000000.0))); + } + + public int available() { + return 0; + } + + public void drain() { + } + + public void flush() { + } + + public int getBufferSize() { + return bufferSize; + } + + public AudioFormat getFormat() { + return format; + } + + public int getFramePosition() { + synchronized (control_mutex) { + return frameposition; + } + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + return getFramePosition(); + } + + public long getMicrosecondPosition() { + return (long) (getFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + synchronized (control_mutex) { + return active; + } + } + + public boolean isRunning() { + synchronized (control_mutex) { + return active; + } + } + + public void start() { + + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (active) + return; + active = true; + active_sg = true; + loopcount = 0; + event = new LineEvent(this, LineEvent.Type.START, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void stop() { + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (!active) + return; + active = false; + active_sg = true; + event = new LineEvent(this, LineEvent.Type.STOP, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void close() { + LineEvent event = null; + + synchronized (control_mutex) { + if (!isOpen()) + return; + stop(); + + event = new LineEvent(this, LineEvent.Type.CLOSE, + getLongFramePosition()); + + open = false; + mixer.getMainMixer().closeLine(this); + } + + if (event != null) + sendEvent(event); + + } + + public boolean isOpen() { + return open; + } + + public void open() throws LineUnavailableException { + if (data == null) { + throw new IllegalArgumentException( + "Illegal call to open() in interface Clip"); + } + open(format, data, offset, bufferSize); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMixingDataLine.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingDataLine.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,522 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.BooleanControl; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.FloatControl; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.Control.Type; + +/** + * General software mixing line. + * + * @author Karl Helgason + */ +public abstract class SoftMixingDataLine implements DataLine { + + public static final FloatControl.Type CHORUS_SEND = new FloatControl.Type( + "Chorus Send") { + }; + + protected static class AudioFloatInputStreamResampler extends + AudioFloatInputStream { + + private AudioFloatInputStream ais; + + private AudioFormat targetFormat; + + private float[] skipbuffer; + + private SoftAbstractResampler resampler; + + private float[] pitch = new float[1]; + + private float[] ibuffer2; + + private float[][] ibuffer; + + private float ibuffer_index = 0; + + private int ibuffer_len = 0; + + private int nrofchannels = 0; + + private float[][] cbuffer; + + private int buffer_len = 512; + + private int pad; + + private int pad2; + + private float[] ix = new float[1]; + + private int[] ox = new int[1]; + + private float[][] mark_ibuffer = null; + + private float mark_ibuffer_index = 0; + + private int mark_ibuffer_len = 0; + + public AudioFloatInputStreamResampler(AudioFloatInputStream ais, + AudioFormat format) { + this.ais = ais; + AudioFormat sourceFormat = ais.getFormat(); + targetFormat = new AudioFormat(sourceFormat.getEncoding(), format + .getSampleRate(), sourceFormat.getSampleSizeInBits(), + sourceFormat.getChannels(), sourceFormat.getFrameSize(), + format.getSampleRate(), sourceFormat.isBigEndian()); + nrofchannels = targetFormat.getChannels(); + Object interpolation = format.getProperty("interpolation"); + if (interpolation != null && (interpolation instanceof String)) { + String resamplerType = (String) interpolation; + if (resamplerType.equalsIgnoreCase("point")) + this.resampler = new SoftPointResampler(); + if (resamplerType.equalsIgnoreCase("linear")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("linear1")) + this.resampler = new SoftLinearResampler(); + if (resamplerType.equalsIgnoreCase("linear2")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("cubic")) + this.resampler = new SoftCubicResampler(); + if (resamplerType.equalsIgnoreCase("lanczos")) + this.resampler = new SoftLanczosResampler(); + if (resamplerType.equalsIgnoreCase("sinc")) + this.resampler = new SoftSincResampler(); + } + if (resampler == null) + resampler = new SoftLinearResampler2(); // new + // SoftLinearResampler2(); + pitch[0] = sourceFormat.getSampleRate() / format.getSampleRate(); + pad = resampler.getPadding(); + pad2 = pad * 2; + ibuffer = new float[nrofchannels][buffer_len + pad2]; + ibuffer2 = new float[nrofchannels * buffer_len]; + ibuffer_index = buffer_len + pad; + ibuffer_len = buffer_len; + } + + public int available() throws IOException { + return 0; + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return targetFormat; + } + + public long getFrameLength() { + return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark((int) (readlimit * pitch[0])); + mark_ibuffer_index = ibuffer_index; + mark_ibuffer_len = ibuffer_len; + if (mark_ibuffer == null) { + mark_ibuffer = new float[ibuffer.length][ibuffer[0].length]; + } + for (int c = 0; c < ibuffer.length; c++) { + float[] from = ibuffer[c]; + float[] to = mark_ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + } + + public boolean markSupported() { + return ais.markSupported(); + } + + private void readNextBuffer() throws IOException { + + if (ibuffer_len == -1) + return; + + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + int buffer_len_pad = ibuffer_len + pad2; + for (int i = ibuffer_len, ix = 0; i < buffer_len_pad; i++, ix++) { + buff[ix] = buff[i]; + } + } + + ibuffer_index -= (ibuffer_len); + + ibuffer_len = ais.read(ibuffer2); + if (ibuffer_len >= 0) { + while (ibuffer_len < ibuffer2.length) { + int ret = ais.read(ibuffer2, ibuffer_len, ibuffer2.length + - ibuffer_len); + if (ret == -1) + break; + ibuffer_len += ret; + } + Arrays.fill(ibuffer2, ibuffer_len, ibuffer2.length, 0); + ibuffer_len /= nrofchannels; + } else { + Arrays.fill(ibuffer2, 0, ibuffer2.length, 0); + } + + int ibuffer2_len = ibuffer2.length; + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + for (int i = c, ix = pad2; i < ibuffer2_len; i += nrofchannels, ix++) { + buff[ix] = ibuffer2[i]; + } + } + + } + + public int read(float[] b, int off, int len) throws IOException { + + if (cbuffer == null || cbuffer[0].length < len / nrofchannels) { + cbuffer = new float[nrofchannels][len / nrofchannels]; + } + if (ibuffer_len == -1) + return -1; + if (len < 0) + return 0; + int remain = len / nrofchannels; + int destPos = 0; + int in_end = ibuffer_len; + while (remain > 0) { + if (ibuffer_len >= 0) { + if (ibuffer_index >= (ibuffer_len + pad)) + readNextBuffer(); + in_end = ibuffer_len + pad; + } + + if (ibuffer_len < 0) { + in_end = pad2; + if (ibuffer_index >= in_end) + break; + } + + if (ibuffer_index < 0) + break; + int preDestPos = destPos; + for (int c = 0; c < nrofchannels; c++) { + ix[0] = ibuffer_index; + ox[0] = destPos; + float[] buff = ibuffer[c]; + resampler.interpolate(buff, ix, in_end, pitch, 0, + cbuffer[c], ox, len / nrofchannels); + } + ibuffer_index = ix[0]; + destPos = ox[0]; + remain -= destPos - preDestPos; + } + for (int c = 0; c < nrofchannels; c++) { + int ix = 0; + float[] buff = cbuffer[c]; + for (int i = c; i < b.length; i += nrofchannels) { + b[i] = buff[ix++]; + } + } + return len - remain * nrofchannels; + } + + public void reset() throws IOException { + ais.reset(); + if (mark_ibuffer == null) + return; + ibuffer_index = mark_ibuffer_index; + ibuffer_len = mark_ibuffer_len; + for (int c = 0; c < ibuffer.length; c++) { + float[] from = mark_ibuffer[c]; + float[] to = ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + + } + + public long skip(long len) throws IOException { + if (len > 0) + return 0; + if (skipbuffer == null) + skipbuffer = new float[1024 * targetFormat.getFrameSize()]; + float[] l_skipbuffer = skipbuffer; + long remain = len; + while (remain > 0) { + int ret = read(l_skipbuffer, 0, (int) Math.min(remain, + skipbuffer.length)); + if (ret < 0) { + if (remain == len) + return ret; + break; + } + remain -= ret; + } + return len - remain; + + } + + } + + private class Gain extends FloatControl { + + private Gain() { + + super(FloatControl.Type.MASTER_GAIN, -80f, 6.0206f, 80f / 128.0f, + -1, 0.0f, "dB", "Minimum", "", "Maximum"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + calcVolume(); + } + } + + private class Mute extends BooleanControl { + + private Mute() { + super(BooleanControl.Type.MUTE, false, "True", "False"); + } + + public void setValue(boolean newValue) { + super.setValue(newValue); + calcVolume(); + } + } + + private class ApplyReverb extends BooleanControl { + + private ApplyReverb() { + super(BooleanControl.Type.APPLY_REVERB, false, "True", "False"); + } + + public void setValue(boolean newValue) { + super.setValue(newValue); + calcVolume(); + } + + } + + private class Balance extends FloatControl { + + private Balance() { + super(FloatControl.Type.BALANCE, -1.0f, 1.0f, (1.0f / 128.0f), -1, + 0.0f, "", "Left", "Center", "Right"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + calcVolume(); + } + + } + + private class Pan extends FloatControl { + + private Pan() { + super(FloatControl.Type.PAN, -1.0f, 1.0f, (1.0f / 128.0f), -1, + 0.0f, "", "Left", "Center", "Right"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + balance_control.setValue(newValue); + } + + public float getValue() { + return balance_control.getValue(); + } + + } + + private class ReverbSend extends FloatControl { + + private ReverbSend() { + super(FloatControl.Type.REVERB_SEND, -80f, 6.0206f, 80f / 128.0f, + -1, -80f, "dB", "Minimum", "", "Maximum"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + balance_control.setValue(newValue); + } + + } + + private class ChorusSend extends FloatControl { + + private ChorusSend() { + super(CHORUS_SEND, -80f, 6.0206f, 80f / 128.0f, -1, -80f, "dB", + "Minimum", "", "Maximum"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + balance_control.setValue(newValue); + } + + } + + private Gain gain_control = new Gain(); + + private Mute mute_control = new Mute(); + + private Balance balance_control = new Balance(); + + private Pan pan_control = new Pan(); + + private ReverbSend reverbsend_control = new ReverbSend(); + + private ChorusSend chorussend_control = new ChorusSend(); + + private ApplyReverb apply_reverb = new ApplyReverb(); + + private Control[] controls; + + protected float leftgain = 1; + + protected float rightgain = 1; + + protected float eff1gain = 0; + + protected float eff2gain = 0; + + protected List listeners = new ArrayList(); + + protected Object control_mutex; + + protected SoftMixingMixer mixer; + + protected DataLine.Info info; + + protected abstract void processControlLogic(); + + protected abstract void processAudioLogic(SoftAudioBuffer[] buffers); + + protected SoftMixingDataLine(SoftMixingMixer mixer, DataLine.Info info) { + this.mixer = mixer; + this.info = info; + this.control_mutex = mixer.control_mutex; + + controls = new Control[] { gain_control, mute_control, balance_control, + pan_control, reverbsend_control, chorussend_control, + apply_reverb }; + calcVolume(); + } + + protected void calcVolume() { + synchronized (control_mutex) { + double gain = Math.pow(10.0, gain_control.getValue() / 20.0); + if (mute_control.getValue()) + gain = 0; + leftgain = (float) gain; + rightgain = (float) gain; + if (mixer.getFormat().getChannels() > 1) { + // -1 = Left, 0 Center, 1 = Right + double balance = balance_control.getValue(); + if (balance > 0) + leftgain *= (1 - balance); + else + rightgain *= (1 + balance); + + } + } + + eff1gain = (float) Math.pow(10.0, reverbsend_control.getValue() / 20.0); + eff2gain = (float) Math.pow(10.0, chorussend_control.getValue() / 20.0); + + if (!apply_reverb.getValue()) { + eff1gain = 0; + } + } + + protected void sendEvent(LineEvent event) { + if (listeners.size() == 0) + return; + LineListener[] listener_array = listeners + .toArray(new LineListener[listeners.size()]); + for (LineListener listener : listener_array) { + listener.update(event); + } + } + + public void addLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.add(listener); + } + } + + public void removeLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.add(listener); + } + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return info; + } + + public Control getControl(Type control) { + if (control != null) { + for (int i = 0; i < controls.length; i++) { + if (controls[i].getType() == control) { + return controls[i]; + } + } + } + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return controls; + } + + public boolean isControlSupported(Type control) { + if (control != null) { + for (int i = 0; i < controls.length; i++) { + if (controls[i].getType() == control) { + return true; + } + } + } + return false; + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMixingMainMixer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMainMixer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,259 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +/** + * Main mixer for SoftMixingMixer. + * + * @author Karl Helgason + */ +public class SoftMixingMainMixer { + + public final static int CHANNEL_LEFT = 0; + + public final static int CHANNEL_RIGHT = 1; + + public final static int CHANNEL_EFFECT1 = 2; + + public final static int CHANNEL_EFFECT2 = 3; + + public final static int CHANNEL_EFFECT3 = 4; + + public final static int CHANNEL_EFFECT4 = 5; + + public final static int CHANNEL_LEFT_DRY = 10; + + public final static int CHANNEL_RIGHT_DRY = 11; + + public final static int CHANNEL_SCRATCH1 = 12; + + public final static int CHANNEL_SCRATCH2 = 13; + + public final static int CHANNEL_CHANNELMIXER_LEFT = 14; + + public final static int CHANNEL_CHANNELMIXER_RIGHT = 15; + + private SoftMixingMixer mixer; + + private AudioInputStream ais; + + private SoftAudioBuffer[] buffers; + + private SoftAudioProcessor reverb; + + private SoftAudioProcessor chorus; + + private SoftAudioProcessor agc; + + private int nrofchannels; + + private Object control_mutex; + + private List openLinesList = new ArrayList(); + + private SoftMixingDataLine[] openLines = new SoftMixingDataLine[0]; + + public AudioInputStream getInputStream() { + return ais; + } + + protected void processAudioBuffers() { + for (int i = 0; i < buffers.length; i++) { + buffers[i].clear(); + } + + SoftMixingDataLine[] openLines; + synchronized (control_mutex) { + openLines = this.openLines; + for (int i = 0; i < openLines.length; i++) { + openLines[i].processControlLogic(); + } + chorus.processControlLogic(); + reverb.processControlLogic(); + agc.processControlLogic(); + } + for (int i = 0; i < openLines.length; i++) { + openLines[i].processAudioLogic(buffers); + } + + chorus.processAudio(); + reverb.processAudio(); + + agc.processAudio(); + + } + + public SoftMixingMainMixer(SoftMixingMixer mixer) { + this.mixer = mixer; + + nrofchannels = mixer.getFormat().getChannels(); + + int buffersize = (int) (mixer.getFormat().getSampleRate() / mixer + .getControlRate()); + + control_mutex = mixer.control_mutex; + buffers = new SoftAudioBuffer[16]; + for (int i = 0; i < buffers.length; i++) { + buffers[i] = new SoftAudioBuffer(buffersize, mixer.getFormat()); + + } + + reverb = new SoftReverb(); + chorus = new SoftChorus(); + agc = new SoftLimiter(); + + float samplerate = mixer.getFormat().getSampleRate(); + float controlrate = mixer.getControlRate(); + reverb.init(samplerate, controlrate); + chorus.init(samplerate, controlrate); + agc.init(samplerate, controlrate); + + reverb.setMixMode(true); + chorus.setMixMode(true); + agc.setMixMode(false); + + chorus.setInput(0, buffers[CHANNEL_EFFECT2]); + chorus.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + chorus.setOutput(1, buffers[CHANNEL_RIGHT]); + chorus.setOutput(2, buffers[CHANNEL_EFFECT1]); + + reverb.setInput(0, buffers[CHANNEL_EFFECT1]); + reverb.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + reverb.setOutput(1, buffers[CHANNEL_RIGHT]); + + agc.setInput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setInput(1, buffers[CHANNEL_RIGHT]); + agc.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setOutput(1, buffers[CHANNEL_RIGHT]); + + InputStream in = new InputStream() { + + private SoftAudioBuffer[] buffers = SoftMixingMainMixer.this.buffers; + + private int nrofchannels = SoftMixingMainMixer.this.mixer + .getFormat().getChannels(); + + private int buffersize = buffers[0].getSize(); + + private byte[] bbuffer = new byte[buffersize + * (SoftMixingMainMixer.this.mixer.getFormat() + .getSampleSizeInBits() / 8) * nrofchannels]; + + private int bbuffer_pos = 0; + + private byte[] single = new byte[1]; + + public void fillBuffer() { + processAudioBuffers(); + for (int i = 0; i < nrofchannels; i++) + buffers[i].get(bbuffer, i); + bbuffer_pos = 0; + } + + public int read(byte[] b, int off, int len) { + int bbuffer_len = bbuffer.length; + int offlen = off + len; + byte[] bbuffer = this.bbuffer; + while (off < offlen) + if (available() == 0) + fillBuffer(); + else { + int bbuffer_pos = this.bbuffer_pos; + while (off < offlen && bbuffer_pos < bbuffer_len) + b[off++] = bbuffer[bbuffer_pos++]; + this.bbuffer_pos = bbuffer_pos; + } + return len; + } + + public int read() throws IOException { + int ret = read(single); + if (ret == -1) + return -1; + return single[0] & 0xFF; + } + + public int available() { + return bbuffer.length - bbuffer_pos; + } + + public void close() { + SoftMixingMainMixer.this.mixer.close(); + } + + }; + + ais = new AudioInputStream(in, mixer.getFormat(), + AudioSystem.NOT_SPECIFIED); + + } + + public void openLine(SoftMixingDataLine line) { + synchronized (control_mutex) { + openLinesList.add(line); + openLines = openLinesList + .toArray(new SoftMixingDataLine[openLinesList.size()]); + } + } + + public void closeLine(SoftMixingDataLine line) { + synchronized (control_mutex) { + openLinesList.remove(line); + openLines = openLinesList + .toArray(new SoftMixingDataLine[openLinesList.size()]); + if (openLines.length == 0) + if (mixer.implicitOpen) + mixer.close(); + } + + } + + public SoftMixingDataLine[] getOpenLines() { + synchronized (control_mutex) { + return openLines; + } + + } + + public void close() { + SoftMixingDataLine[] openLines = this.openLines; + for (int i = 0; i < openLines.length; i++) { + openLines[i].close(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMixingMixer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,529 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.Line; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.Mixer; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.Control.Type; + +/** + * Software audio mixer + * + * @author Karl Helgason + */ +public class SoftMixingMixer implements Mixer { + + private static class Info extends Mixer.Info { + public Info() { + super(INFO_NAME, INFO_VENDOR, INFO_DESCRIPTION, INFO_VERSION); + } + } + + protected static final String INFO_NAME = "Gervill Sound Mixer"; + + protected static final String INFO_VENDOR = "OpenJDK Proposal"; + + protected static final String INFO_DESCRIPTION = "Software Sound Mixer"; + + protected static final String INFO_VERSION = "1.0"; + + protected final static Mixer.Info info = new Info(); + + protected Object control_mutex = this; + + protected boolean implicitOpen = false; + + private boolean open = false; + + private SoftMixingMainMixer mainmixer = null; + + private AudioFormat format = new AudioFormat(44100, 16, 2, true, false); + + private SourceDataLine sourceDataLine = null; + + private SoftAudioPusher pusher = null; + + private AudioInputStream pusher_stream = null; + + private float controlrate = 147f; + + private long latency = 100000; // 100 msec + + private boolean jitter_correction = false; + + private List listeners = new ArrayList(); + + private javax.sound.sampled.Line.Info[] sourceLineInfo; + + public SoftMixingMixer() { + + sourceLineInfo = new javax.sound.sampled.Line.Info[2]; + + ArrayList formats = new ArrayList(); + for (int channels = 1; channels <= 2; channels++) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + for (int bits = 16; bits < 32; bits += 8) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + AudioFormat[] formats_array = formats.toArray(new AudioFormat[formats + .size()]); + sourceLineInfo[0] = new DataLine.Info(SourceDataLine.class, + formats_array, AudioSystem.NOT_SPECIFIED, + AudioSystem.NOT_SPECIFIED); + sourceLineInfo[1] = new DataLine.Info(Clip.class, formats_array, + AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED); + } + + public Line getLine(Line.Info info) throws LineUnavailableException { + + if (!isLineSupported(info)) + throw new IllegalArgumentException("Line unsupported: " + info); + + if ((info.getLineClass() == SourceDataLine.class)) { + return new SoftMixingSourceDataLine(this, (DataLine.Info) info); + } + if ((info.getLineClass() == Clip.class)) { + return new SoftMixingClip(this, (DataLine.Info) info); + } + + throw new IllegalArgumentException("Line unsupported: " + info); + } + + public int getMaxLines(Line.Info info) { + if (info.getLineClass() == SourceDataLine.class) + return AudioSystem.NOT_SPECIFIED; + if (info.getLineClass() == Clip.class) + return AudioSystem.NOT_SPECIFIED; + return 0; + } + + public javax.sound.sampled.Mixer.Info getMixerInfo() { + return info; + } + + public javax.sound.sampled.Line.Info[] getSourceLineInfo() { + Line.Info[] localArray = new Line.Info[sourceLineInfo.length]; + System.arraycopy(sourceLineInfo, 0, localArray, 0, + sourceLineInfo.length); + return localArray; + } + + public javax.sound.sampled.Line.Info[] getSourceLineInfo( + javax.sound.sampled.Line.Info info) { + int i; + ArrayList infos = new ArrayList(); + + for (i = 0; i < sourceLineInfo.length; i++) { + if (info.matches(sourceLineInfo[i])) { + infos.add(sourceLineInfo[i]); + } + } + return infos.toArray(new Line.Info[infos.size()]); + } + + public Line[] getSourceLines() { + + Line[] localLines; + + synchronized (control_mutex) { + + if (mainmixer == null) + return new Line[0]; + SoftMixingDataLine[] sourceLines = mainmixer.getOpenLines(); + + localLines = new Line[sourceLines.length]; + + for (int i = 0; i < localLines.length; i++) { + localLines[i] = sourceLines[i]; + } + } + + return localLines; + } + + public javax.sound.sampled.Line.Info[] getTargetLineInfo() { + return new javax.sound.sampled.Line.Info[0]; + } + + public javax.sound.sampled.Line.Info[] getTargetLineInfo( + javax.sound.sampled.Line.Info info) { + return new javax.sound.sampled.Line.Info[0]; + } + + public Line[] getTargetLines() { + return new Line[0]; + } + + public boolean isLineSupported(javax.sound.sampled.Line.Info info) { + if (info != null) { + for (int i = 0; i < sourceLineInfo.length; i++) { + if (info.matches(sourceLineInfo[i])) { + return true; + } + } + } + return false; + } + + public boolean isSynchronizationSupported(Line[] lines, boolean maintainSync) { + return false; + } + + public void synchronize(Line[] lines, boolean maintainSync) { + throw new IllegalArgumentException( + "Synchronization not supported by this mixer."); + } + + public void unsynchronize(Line[] lines) { + throw new IllegalArgumentException( + "Synchronization not supported by this mixer."); + } + + public void addLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.add(listener); + } + } + + private void sendEvent(LineEvent event) { + if (listeners.size() == 0) + return; + LineListener[] listener_array = listeners + .toArray(new LineListener[listeners.size()]); + for (LineListener listener : listener_array) { + listener.update(event); + } + } + + public void close() { + if (!isOpen()) + return; + + sendEvent(new LineEvent(this, LineEvent.Type.CLOSE, + AudioSystem.NOT_SPECIFIED)); + + SoftAudioPusher pusher_to_be_closed = null; + AudioInputStream pusher_stream_to_be_closed = null; + synchronized (control_mutex) { + if (pusher != null) { + pusher_to_be_closed = pusher; + pusher_stream_to_be_closed = pusher_stream; + pusher = null; + pusher_stream = null; + } + } + + if (pusher_to_be_closed != null) { + // Pusher must not be closed synchronized against control_mutex + // this may result in synchronized conflict between pusher and + // current thread. + pusher_to_be_closed.stop(); + + try { + pusher_stream_to_be_closed.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + synchronized (control_mutex) { + + if (mainmixer != null) + mainmixer.close(); + open = false; + + if (sourceDataLine != null) { + sourceDataLine.drain(); + sourceDataLine.close(); + sourceDataLine = null; + } + + } + + } + + public Control getControl(Type control) { + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return new Control[0]; + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return new Line.Info(Mixer.class); + } + + public boolean isControlSupported(Type control) { + return false; + } + + public boolean isOpen() { + synchronized (control_mutex) { + return open; + } + } + + public void open() throws LineUnavailableException { + if (isOpen()) { + implicitOpen = false; + return; + } + open(null); + } + + public void open(SourceDataLine line) throws LineUnavailableException { + if (isOpen()) { + implicitOpen = false; + return; + } + synchronized (control_mutex) { + + try { + + if (line != null) + format = line.getFormat(); + + AudioInputStream ais = openStream(getFormat()); + + if (line == null) { + synchronized (SoftMixingMixerProvider.mutex) { + SoftMixingMixerProvider.lockthread = Thread + .currentThread(); + } + + try { + Mixer defaultmixer = AudioSystem.getMixer(null); + if (defaultmixer != null) + { + // Search for suitable line + + DataLine.Info idealinfo = null; + AudioFormat idealformat = null; + + Line.Info[] lineinfos = defaultmixer.getSourceLineInfo(); + idealFound: + for (int i = 0; i < lineinfos.length; i++) { + if(lineinfos[i].getLineClass() == SourceDataLine.class) + { + DataLine.Info info = (DataLine.Info)lineinfos[i]; + AudioFormat[] formats = info.getFormats(); + for (int j = 0; j < formats.length; j++) { + AudioFormat format = formats[j]; + if(format.getChannels() == 2 || + format.getChannels() == AudioSystem.NOT_SPECIFIED) + if(format.getEncoding().equals(Encoding.PCM_SIGNED) || + format.getEncoding().equals(Encoding.PCM_UNSIGNED)) + if(format.getSampleRate() == AudioSystem.NOT_SPECIFIED || + format.getSampleRate() == 48000.0) + if(format.getSampleSizeInBits() == AudioSystem.NOT_SPECIFIED || + format.getSampleSizeInBits() == 16) + { + idealinfo = info; + int ideal_channels = format.getChannels(); + boolean ideal_signed = format.getEncoding().equals(Encoding.PCM_SIGNED); + float ideal_rate = format.getSampleRate(); + boolean ideal_endian = format.isBigEndian(); + int ideal_bits = format.getSampleSizeInBits(); + if(ideal_bits == AudioSystem.NOT_SPECIFIED) ideal_bits = 16; + if(ideal_channels == AudioSystem.NOT_SPECIFIED) ideal_channels = 2; + if(ideal_rate == AudioSystem.NOT_SPECIFIED) ideal_rate = 48000; + idealformat = new AudioFormat(ideal_rate, ideal_bits, + ideal_channels, ideal_signed, ideal_endian); + break idealFound; + } + } + } + } + + if(idealformat != null) + { + format = idealformat; + line = (SourceDataLine) defaultmixer.getLine(idealinfo); + } + } + + if(line == null) + line = AudioSystem.getSourceDataLine(format); + } finally { + synchronized (SoftMixingMixerProvider.mutex) { + SoftMixingMixerProvider.lockthread = null; + } + } + + if (line == null) + throw new IllegalArgumentException("No line matching " + + info.toString() + " is supported."); + } + + double latency = this.latency; + + if (!line.isOpen()) { + int bufferSize = getFormat().getFrameSize() + * (int) (getFormat().getFrameRate() * (latency / 1000000f)); + line.open(getFormat(), bufferSize); + + // Remember that we opened that line + // so we can close again in SoftSynthesizer.close() + sourceDataLine = line; + } + if (!line.isActive()) + line.start(); + + int controlbuffersize = 512; + try { + controlbuffersize = ais.available(); + } catch (IOException e) { + } + + // Tell mixer not fill read buffers fully. + // This lowers latency, and tells DataPusher + // to read in smaller amounts. + // mainmixer.readfully = false; + // pusher = new DataPusher(line, ais); + + int buffersize = line.getBufferSize(); + buffersize -= buffersize % controlbuffersize; + + if (buffersize < 3 * controlbuffersize) + buffersize = 3 * controlbuffersize; + + if (jitter_correction) { + ais = new SoftJitterCorrector(ais, buffersize, + controlbuffersize); + } + pusher = new SoftAudioPusher(line, ais, controlbuffersize); + pusher_stream = ais; + pusher.start(); + + } catch (LineUnavailableException e) { + if (isOpen()) + close(); + throw new LineUnavailableException(e.toString()); + } + + } + } + + public AudioInputStream openStream(AudioFormat targetFormat) + throws LineUnavailableException { + + if (isOpen()) + throw new LineUnavailableException("Mixer is already open"); + + synchronized (control_mutex) { + + open = true; + + implicitOpen = false; + + if (targetFormat != null) + format = targetFormat; + + mainmixer = new SoftMixingMainMixer(this); + + sendEvent(new LineEvent(this, LineEvent.Type.OPEN, + AudioSystem.NOT_SPECIFIED)); + + return mainmixer.getInputStream(); + + } + + } + + public void removeLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.remove(listener); + } + } + + public long getLatency() { + synchronized (control_mutex) { + return latency; + } + } + + public AudioFormat getFormat() { + synchronized (control_mutex) { + return format; + } + } + + protected float getControlRate() { + return controlrate; + } + + protected SoftMixingMainMixer getMainMixer() { + if (!isOpen()) + return null; + return mainmixer; + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,66 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.sampled.Mixer; +import javax.sound.sampled.Mixer.Info; +import javax.sound.sampled.spi.MixerProvider; + +/** + * Provider for software audio mixer + * + * @author Karl Helgason + */ +public class SoftMixingMixerProvider extends MixerProvider { + + static SoftMixingMixer globalmixer = null; + + static Thread lockthread = null; + + protected final static Object mutex = new Object(); + + public Mixer getMixer(Info info) { + if (!(info == null || info == SoftMixingMixer.info)) { + throw new IllegalArgumentException("Mixer " + info.toString() + + " not supported by this provider."); + } + synchronized (mutex) { + if (lockthread != null) + if (Thread.currentThread() == lockthread) + throw new IllegalArgumentException("Mixer " + + info.toString() + + " not supported by this provider."); + if (globalmixer == null) + globalmixer = new SoftMixingMixer(); + return globalmixer; + } + + } + + public Info[] getMixerInfo() { + return new Info[] { SoftMixingMixer.info }; + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,519 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; + +/** + * SourceDataLine implemention for the SoftMixingMixer. + * + * @author Karl Helgason + */ +public class SoftMixingSourceDataLine extends SoftMixingDataLine implements + SourceDataLine { + + private boolean open = false; + + private AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false); + + private int framesize; + + private int bufferSize = -1; + + private float[] readbuffer; + + private boolean active = false; + + private byte[] cycling_buffer; + + private int cycling_read_pos = 0; + + private int cycling_write_pos = 0; + + private int cycling_avail = 0; + + private long cycling_framepos = 0; + + private AudioFloatInputStream afis; + + private static class NonBlockingFloatInputStream extends + AudioFloatInputStream { + AudioFloatInputStream ais; + + public NonBlockingFloatInputStream(AudioFloatInputStream ais) { + this.ais = ais; + } + + public int available() throws IOException { + return ais.available(); + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return ais.getFormat(); + } + + public long getFrameLength() { + return ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark(readlimit); + } + + public boolean markSupported() { + return ais.markSupported(); + } + + public int read(float[] b, int off, int len) throws IOException { + int avail = available(); + if (len > avail) { + int ret = ais.read(b, off, avail); + Arrays.fill(b, off + ret, off + len, 0); + return len; + } + return ais.read(b, off, len); + } + + public void reset() throws IOException { + ais.reset(); + } + + public long skip(long len) throws IOException { + return ais.skip(len); + } + + } + + protected SoftMixingSourceDataLine(SoftMixingMixer mixer, DataLine.Info info) { + super(mixer, info); + } + + public int write(byte[] b, int off, int len) { + if (!isOpen()) + return 0; + if (len % framesize != 0) + throw new IllegalArgumentException( + "Number of bytes does not represent an integral number of sample frames."); + + byte[] buff = cycling_buffer; + int buff_len = cycling_buffer.length; + + int l = 0; + while (l != len) { + int avail; + synchronized (cycling_buffer) { + int pos = cycling_write_pos; + avail = cycling_avail; + while (l != len) { + if (avail == buff_len) + break; + buff[pos++] = b[off++]; + l++; + avail++; + if (pos == buff_len) + pos = 0; + } + cycling_avail = avail; + cycling_write_pos = pos; + if (l == len) + return l; + } + if (avail == buff_len) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + return l; + } + if (!isRunning()) + return l; + } + } + + return l; + } + + // + // BooleanControl.Type.APPLY_REVERB + // BooleanControl.Type.MUTE + // EnumControl.Type.REVERB + // + // FloatControl.Type.SAMPLE_RATE + // FloatControl.Type.REVERB_SEND + // FloatControl.Type.VOLUME + // FloatControl.Type.PAN + // FloatControl.Type.MASTER_GAIN + // FloatControl.Type.BALANCE + + private boolean _active = false; + + private AudioFormat outputformat; + + private int out_nrofchannels; + + private int in_nrofchannels; + + private float _rightgain; + + private float _leftgain; + + private float _eff1gain; + + private float _eff2gain; + + protected void processControlLogic() { + _active = active; + _rightgain = rightgain; + _leftgain = leftgain; + _eff1gain = eff1gain; + _eff2gain = eff2gain; + } + + protected void processAudioLogic(SoftAudioBuffer[] buffers) { + if (_active) { + float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array(); + float[] right = buffers[SoftMixingMainMixer.CHANNEL_RIGHT].array(); + int bufferlen = buffers[SoftMixingMainMixer.CHANNEL_LEFT].getSize(); + + int readlen = bufferlen * in_nrofchannels; + if (readbuffer == null || readbuffer.length < readlen) { + readbuffer = new float[readlen]; + } + int ret = 0; + try { + ret = afis.read(readbuffer); + if (ret != in_nrofchannels) + Arrays.fill(readbuffer, ret, readlen, 0); + } catch (IOException e) { + } + + int in_c = in_nrofchannels; + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + left[i] += readbuffer[ix] * _leftgain; + } + if (out_nrofchannels != 1) { + if (in_nrofchannels == 1) { + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } else { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } + + } + + if (_eff1gain > 0.0001) { + float[] eff1 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT1] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + } + } + + if (_eff2gain > 0.0001) { + float[] eff2 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT2] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + } + } + + } + } + + public void open() throws LineUnavailableException { + open(format); + } + + public void open(AudioFormat format) throws LineUnavailableException { + if (bufferSize == -1) + bufferSize = ((int) (format.getFrameRate() / 2)) + * format.getFrameSize(); + open(format, bufferSize); + } + + public void open(AudioFormat format, int bufferSize) + throws LineUnavailableException { + + LineEvent event = null; + + if (bufferSize < format.getFrameSize() * 32) + bufferSize = format.getFrameSize() * 32; + + synchronized (control_mutex) { + + if (!isOpen()) { + if (!mixer.isOpen()) { + mixer.open(); + mixer.implicitOpen = true; + } + + event = new LineEvent(this, LineEvent.Type.OPEN, 0); + + this.bufferSize = bufferSize - bufferSize + % format.getFrameSize(); + this.format = format; + this.framesize = format.getFrameSize(); + this.outputformat = mixer.getFormat(); + out_nrofchannels = outputformat.getChannels(); + in_nrofchannels = format.getChannels(); + + open = true; + + mixer.getMainMixer().openLine(this); + + cycling_buffer = new byte[framesize * bufferSize]; + cycling_read_pos = 0; + cycling_write_pos = 0; + cycling_avail = 0; + cycling_framepos = 0; + + InputStream cycling_inputstream = new InputStream() { + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b); + if (ret < 0) + return ret; + return b[0] & 0xFF; + } + + public int available() throws IOException { + synchronized (cycling_buffer) { + return cycling_avail; + } + } + + public int read(byte[] b, int off, int len) + throws IOException { + + synchronized (cycling_buffer) { + if (len > cycling_avail) + len = cycling_avail; + int pos = cycling_read_pos; + byte[] buff = cycling_buffer; + int buff_len = buff.length; + for (int i = 0; i < len; i++) { + b[off++] = buff[pos]; + pos++; + if (pos == buff_len) + pos = 0; + } + cycling_read_pos = pos; + cycling_avail -= len; + cycling_framepos += len / framesize; + } + return len; + } + + }; + + afis = AudioFloatInputStream + .getInputStream(new AudioInputStream( + cycling_inputstream, format, + AudioSystem.NOT_SPECIFIED)); + afis = new NonBlockingFloatInputStream(afis); + + if (Math.abs(format.getSampleRate() + - outputformat.getSampleRate()) > 0.000001) + afis = new AudioFloatInputStreamResampler(afis, + outputformat); + + } else { + if (!format.matches(getFormat())) { + throw new IllegalStateException( + "Line is already open with format " + getFormat() + + " and bufferSize " + getBufferSize()); + } + } + + } + + if (event != null) + sendEvent(event); + + } + + public int available() { + synchronized (cycling_buffer) { + return cycling_buffer.length - cycling_avail; + } + } + + public void drain() { + while (true) { + int avail; + synchronized (cycling_buffer) { + avail = cycling_avail; + } + if (avail != 0) + return; + try { + Thread.sleep(1); + } catch (InterruptedException e) { + return; + } + } + } + + public void flush() { + synchronized (cycling_buffer) { + cycling_read_pos = 0; + cycling_write_pos = 0; + cycling_avail = 0; + } + } + + public int getBufferSize() { + synchronized (control_mutex) { + return bufferSize; + } + } + + public AudioFormat getFormat() { + synchronized (control_mutex) { + return format; + } + } + + public int getFramePosition() { + return (int) getLongFramePosition(); + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + synchronized (cycling_buffer) { + return cycling_framepos; + } + } + + public long getMicrosecondPosition() { + return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + synchronized (control_mutex) { + return active; + } + } + + public boolean isRunning() { + synchronized (control_mutex) { + return active; + } + } + + public void start() { + + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (active) + return; + active = true; + event = new LineEvent(this, LineEvent.Type.START, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void stop() { + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (!active) + return; + active = false; + event = new LineEvent(this, LineEvent.Type.STOP, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void close() { + + LineEvent event = null; + + synchronized (control_mutex) { + if (!isOpen()) + return; + stop(); + + event = new LineEvent(this, LineEvent.Type.CLOSE, + getLongFramePosition()); + + open = false; + mixer.getMainMixer().closeLine(this); + } + + if (event != null) + sendEvent(event); + + } + + public boolean isOpen() { + synchronized (control_mutex) { + return open; + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,775 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This class decodes information from ModelPeformer for use in SoftVoice. + * It also adds default connections if they where missing in ModelPerformer. + * + * @author Karl Helgason + */ +public class SoftPerformer { + + static ModelConnectionBlock[] defaultconnections + = new ModelConnectionBlock[42]; + + static { + int o = 0; + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "on", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1, new ModelDestination(new ModelIdentifier("eg", "on", 0))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "on", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1, new ModelDestination(new ModelIdentifier("eg", "on", 1))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("eg", "active", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1, new ModelDestination(new ModelIdentifier("mixer", "active", 0))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("eg", 0), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "velocity"), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi", "pitch"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(new ModelIdentifier("midi_rpn", "0"), + new ModelTransform() { + public double transform(double value) { + int v = (int) (value * 16384.0); + int msb = v >> 7; + int lsb = v & 127; + return msb * 100 + lsb; + } + }), + new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "keynumber"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 12800, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "7"), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "8"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "balance"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "10"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "pan"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "11"), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "91"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "reverb"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "93"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "chorus"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "71"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 200, new ModelDestination(new ModelIdentifier("filter", "q"))); + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "74"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 9600, new ModelDestination(new ModelIdentifier("filter", "freq"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "72"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 6000, new ModelDestination(new ModelIdentifier("eg", "release2"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "73"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 2000, new ModelDestination(new ModelIdentifier("eg", "attack2"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "75"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 6000, new ModelDestination(new ModelIdentifier("eg", "decay2"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "67"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_SWITCH), + -50, new ModelDestination(ModelDestination.DESTINATION_GAIN)); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "67"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_SWITCH), + -2400, new ModelDestination(ModelDestination.DESTINATION_FILTER_FREQ)); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_rpn", "1"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 100, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_rpn", "2"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 12800, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("master", "fine_tuning"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 100, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("master", "coarse_tuning"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 12800, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock(13500, + new ModelDestination(new ModelIdentifier("filter", "freq", 0))); + + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "delay", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "attack", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "hold", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "decay", 0))); + defaultconnections[o++] = new ModelConnectionBlock(1000, + new ModelDestination(new ModelIdentifier("eg", "sustain", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "release", 0))); + defaultconnections[o++] = new ModelConnectionBlock(1200.0 + * Math.log(0.015) / Math.log(2), new ModelDestination( + new ModelIdentifier("eg", "shutdown", 0))); // 15 msec default + + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "delay", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "attack", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "hold", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "decay", 1))); + defaultconnections[o++] = new ModelConnectionBlock(1000, + new ModelDestination(new ModelIdentifier("eg", "sustain", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "release", 1))); + + defaultconnections[o++] = new ModelConnectionBlock(-8.51318, + new ModelDestination(new ModelIdentifier("lfo", "freq", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("lfo", "delay", 0))); + defaultconnections[o++] = new ModelConnectionBlock(-8.51318, + new ModelDestination(new ModelIdentifier("lfo", "freq", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("lfo", "delay", 1))); + + } + public int keyFrom = 0; + public int keyTo = 127; + public int velFrom = 0; + public int velTo = 127; + public int exclusiveClass = 0; + public boolean selfNonExclusive = false; + public boolean forcedVelocity = false; + public boolean forcedKeynumber = false; + public ModelPerformer performer; + public ModelConnectionBlock[] connections; + public ModelOscillator[] oscillators; + public Map midi_rpn_connections = new HashMap(); + public Map midi_nrpn_connections = new HashMap(); + public int[][] midi_ctrl_connections; + public int[][] midi_connections; + public int[] ctrl_connections; + private List ctrl_connections_list = new ArrayList(); + + private static class KeySortComparator implements Comparator { + + public int compare(ModelSource o1, ModelSource o2) { + return o1.getIdentifier().toString().compareTo( + o2.getIdentifier().toString()); + } + } + private static KeySortComparator keySortComparator = new KeySortComparator(); + + private String extractKeys(ModelConnectionBlock conn) { + StringBuffer sb = new StringBuffer(); + if (conn.getSources() != null) { + sb.append("["); + ModelSource[] srcs = conn.getSources(); + ModelSource[] srcs2 = new ModelSource[srcs.length]; + for (int i = 0; i < srcs.length; i++) + srcs2[i] = srcs[i]; + Arrays.sort(srcs2, keySortComparator); + for (int i = 0; i < srcs.length; i++) { + sb.append(srcs[i].getIdentifier()); + sb.append(";"); + } + sb.append("]"); + } + sb.append(";"); + if (conn.getDestination() != null) { + sb.append(conn.getDestination().getIdentifier()); + } + sb.append(";"); + return sb.toString(); + } + + private void processSource(ModelSource src, int ix) { + ModelIdentifier id = src.getIdentifier(); + String o = id.getObject(); + if (o.equals("midi_cc")) + processMidiControlSource(src, ix); + else if (o.equals("midi_rpn")) + processMidiRpnSource(src, ix); + else if (o.equals("midi_nrpn")) + processMidiNrpnSource(src, ix); + else if (o.equals("midi")) + processMidiSource(src, ix); + else if (o.equals("noteon")) + processNoteOnSource(src, ix); + else if (o.equals("osc")) + return; + else if (o.equals("mixer")) + return; + else + ctrl_connections_list.add(ix); + } + + private void processMidiControlSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + if (v == null) + return; + int c = Integer.parseInt(v); + if (midi_ctrl_connections[c] == null) + midi_ctrl_connections[c] = new int[]{ix}; + else { + int[] olda = midi_ctrl_connections[c]; + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_ctrl_connections[c] = newa; + } + } + + private void processNoteOnSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + int c = -1; + if (v.equals("on")) + c = 3; + if (v.equals("keynumber")) + c = 4; + if (c == -1) + return; + if (midi_connections[c] == null) + midi_connections[c] = new int[]{ix}; + else { + int[] olda = midi_connections[c]; + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_connections[c] = newa; + } + } + + private void processMidiSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + int c = -1; + if (v.equals("pitch")) + c = 0; + if (v.equals("channel_pressure")) + c = 1; + if (v.equals("poly_pressure")) + c = 2; + if (c == -1) + return; + if (midi_connections[c] == null) + midi_connections[c] = new int[]{ix}; + else { + int[] olda = midi_connections[c]; + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_connections[c] = newa; + } + } + + private void processMidiRpnSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + if (v == null) + return; + int c = Integer.parseInt(v); + if (midi_rpn_connections.get(c) == null) + midi_rpn_connections.put(c, new int[]{ix}); + else { + int[] olda = midi_rpn_connections.get(c); + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_rpn_connections.put(c, newa); + } + } + + private void processMidiNrpnSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + if (v == null) + return; + int c = Integer.parseInt(v); + if (midi_nrpn_connections.get(c) == null) + midi_nrpn_connections.put(c, new int[]{ix}); + else { + int[] olda = midi_nrpn_connections.get(c); + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_nrpn_connections.put(c, newa); + } + } + + public SoftPerformer(ModelPerformer performer) { + this.performer = performer; + + keyFrom = performer.getKeyFrom(); + keyTo = performer.getKeyTo(); + velFrom = performer.getVelFrom(); + velTo = performer.getVelTo(); + exclusiveClass = performer.getExclusiveClass(); + selfNonExclusive = performer.isSelfNonExclusive(); + + Map connmap = new HashMap(); + + List performer_connections = new ArrayList(); + performer_connections.addAll(performer.getConnectionBlocks()); + + if (performer.isDefaultConnectionsEnabled()) { + + // Add modulation depth range (RPN 5) to the modulation wheel (cc#1) + + boolean isModulationWheelConectionFound = false; + for (int j = 0; j < performer_connections.size(); j++) { + ModelConnectionBlock connection = performer_connections.get(j); + ModelSource[] sources = connection.getSources(); + ModelDestination dest = connection.getDestination(); + boolean isModulationWheelConection = false; + if (dest != null && sources != null && sources.length > 1) { + for (int i = 0; i < sources.length; i++) { + // check if connection block has the source "modulation + // wheel cc#1" + if (sources[i].getIdentifier().getObject().equals( + "midi_cc")) { + if (sources[i].getIdentifier().getVariable() + .equals("1")) { + isModulationWheelConection = true; + isModulationWheelConectionFound = true; + break; + } + } + } + } + if (isModulationWheelConection) { + + ModelConnectionBlock newconnection = new ModelConnectionBlock(); + newconnection.setSources(connection.getSources()); + newconnection.setDestination(connection.getDestination()); + newconnection.addSource(new ModelSource( + new ModelIdentifier("midi_rpn", "5"))); + newconnection.setScale(connection.getScale() * 256.0); + performer_connections.set(j, newconnection); + } + } + + if (!isModulationWheelConectionFound) { + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(new ModelIdentifier("midi_cc", "1", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 50, + new ModelDestination(ModelDestination.DESTINATION_PITCH)); + conn.addSource(new ModelSource(new ModelIdentifier("midi_rpn", + "5"))); + conn.setScale(conn.getScale() * 256.0); + performer_connections.add(conn); + + } + + // Let Aftertouch to behave just like modulation wheel (cc#1) + boolean channel_pressure_set = false; + boolean poly_pressure = false; + ModelConnectionBlock mod_cc_1_connection = null; + int mod_cc_1_connection_src_ix = 0; + + for (ModelConnectionBlock connection : performer_connections) { + ModelSource[] sources = connection.getSources(); + ModelDestination dest = connection.getDestination(); + // if(dest != null && sources != null) + if (dest != null && sources != null) { + for (int i = 0; i < sources.length; i++) { + ModelIdentifier srcid = sources[i].getIdentifier(); + // check if connection block has the source "modulation + // wheel cc#1" + if (srcid.getObject().equals("midi_cc")) { + if (srcid.getVariable().equals("1")) { + mod_cc_1_connection = connection; + mod_cc_1_connection_src_ix = i; + } + } + // check if channel or poly pressure are already + // connected + if (srcid.getObject().equals("midi")) { + if (srcid.getVariable().equals("channel_pressure")) + channel_pressure_set = true; + if (srcid.getVariable().equals("poly_pressure")) + poly_pressure = true; + } + } + } + + } + + if (mod_cc_1_connection != null) { + if (!channel_pressure_set) { + ModelConnectionBlock mc = new ModelConnectionBlock(); + mc.setDestination(mod_cc_1_connection.getDestination()); + mc.setScale(mod_cc_1_connection.getScale()); + ModelSource[] src_list = mod_cc_1_connection.getSources(); + ModelSource[] src_list_new = new ModelSource[src_list.length]; + for (int i = 0; i < src_list_new.length; i++) + src_list_new[i] = src_list[i]; + src_list_new[mod_cc_1_connection_src_ix] = new ModelSource( + new ModelIdentifier("midi", "channel_pressure")); + mc.setSources(src_list_new); + connmap.put(extractKeys(mc), mc); + } + if (!poly_pressure) { + ModelConnectionBlock mc = new ModelConnectionBlock(); + mc.setDestination(mod_cc_1_connection.getDestination()); + mc.setScale(mod_cc_1_connection.getScale()); + ModelSource[] src_list = mod_cc_1_connection.getSources(); + ModelSource[] src_list_new = new ModelSource[src_list.length]; + for (int i = 0; i < src_list_new.length; i++) + src_list_new[i] = src_list[i]; + src_list_new[mod_cc_1_connection_src_ix] = new ModelSource( + new ModelIdentifier("midi", "poly_pressure")); + mc.setSources(src_list_new); + connmap.put(extractKeys(mc), mc); + } + } + + // Enable Vibration Sound Controllers : 76, 77, 78 + ModelConnectionBlock found_vib_connection = null; + for (ModelConnectionBlock connection : performer_connections) { + ModelSource[] sources = connection.getSources(); + if (sources.length != 0 + && sources[0].getIdentifier().getObject().equals("lfo")) { + if (connection.getDestination().getIdentifier().equals( + ModelDestination.DESTINATION_PITCH)) { + if (found_vib_connection == null) + found_vib_connection = connection; + else { + if (found_vib_connection.getSources().length > sources.length) + found_vib_connection = connection; + else if (found_vib_connection.getSources()[0] + .getIdentifier().getInstance() < 1) { + if (found_vib_connection.getSources()[0] + .getIdentifier().getInstance() > + sources[0].getIdentifier().getInstance()) { + found_vib_connection = connection; + } + } + } + + } + } + } + + int instance = 1; + + if (found_vib_connection != null) { + instance = found_vib_connection.getSources()[0].getIdentifier() + .getInstance(); + } + ModelConnectionBlock connection; + + connection = new ModelConnectionBlock( + new ModelSource(new ModelIdentifier("midi_cc", "78"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 2000, new ModelDestination( + new ModelIdentifier("lfo", "delay2", instance))); + connmap.put(extractKeys(connection), connection); + + final double scale = found_vib_connection == null ? 0 + : found_vib_connection.getScale(); + connection = new ModelConnectionBlock( + new ModelSource(new ModelIdentifier("lfo", instance)), + new ModelSource(new ModelIdentifier("midi_cc", "77"), + new ModelTransform() { + double s = scale; + public double transform(double value) { + value = value * 2 - 1; + value *= 600; + if (s == 0) { + return value; + } else if (s > 0) { + if (value < -s) + value = -s; + return value; + } else { + if (value < s) + value = -s; + return -value; + } + } + }), new ModelDestination(ModelDestination.DESTINATION_PITCH)); + connmap.put(extractKeys(connection), connection); + + connection = new ModelConnectionBlock( + new ModelSource(new ModelIdentifier("midi_cc", "76"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 2400, new ModelDestination( + new ModelIdentifier("lfo", "freq", instance))); + connmap.put(extractKeys(connection), connection); + + } + + // Add default connection blocks + if (performer.isDefaultConnectionsEnabled()) + for (ModelConnectionBlock connection : defaultconnections) + connmap.put(extractKeys(connection), connection); + // Add connection blocks from modelperformer + for (ModelConnectionBlock connection : performer_connections) + connmap.put(extractKeys(connection), connection); + // seperate connection blocks : Init time, Midi Time, Midi/Control Time, + // Control Time + List connections = new ArrayList(); + + midi_ctrl_connections = new int[128][]; + for (int i = 0; i < midi_ctrl_connections.length; i++) { + midi_ctrl_connections[i] = null; + } + midi_connections = new int[5][]; + for (int i = 0; i < midi_connections.length; i++) { + midi_connections[i] = null; + } + + int ix = 0; + boolean mustBeOnTop = false; + + for (ModelConnectionBlock connection : connmap.values()) { + if (connection.getDestination() != null) { + ModelDestination dest = connection.getDestination(); + ModelIdentifier id = dest.getIdentifier(); + if (id.getObject().equals("noteon")) { + mustBeOnTop = true; + if (id.getVariable().equals("keynumber")) + forcedKeynumber = true; + if (id.getVariable().equals("velocity")) + forcedVelocity = true; + } + } + if (mustBeOnTop) { + connections.add(0, connection); + mustBeOnTop = false; + } else + connections.add(connection); + } + + for (ModelConnectionBlock connection : connections) { + if (connection.getSources() != null) { + ModelSource[] srcs = connection.getSources(); + for (int i = 0; i < srcs.length; i++) { + processSource(srcs[i], ix); + } + } + ix++; + } + + this.connections = new ModelConnectionBlock[connections.size()]; + connections.toArray(this.connections); + + this.ctrl_connections = new int[ctrl_connections_list.size()]; + + for (int i = 0; i < this.ctrl_connections.length; i++) + this.ctrl_connections[i] = ctrl_connections_list.get(i); + + oscillators = new ModelOscillator[performer.getOscillators().size()]; + performer.getOscillators().toArray(oscillators); + + for (ModelConnectionBlock conn : connections) { + if (conn.getDestination() != null) { + if (isUnnecessaryTransform(conn.getDestination().getTransform())) { + conn.getDestination().setTransform(null); + } + } + if (conn.getSources() != null) { + for (ModelSource src : conn.getSources()) { + if (isUnnecessaryTransform(src.getTransform())) { + src.setTransform(null); + } + } + } + } + + } + + private static boolean isUnnecessaryTransform(ModelTransform transform) { + if (transform == null) + return false; + if (!(transform instanceof ModelStandardTransform)) + return false; + ModelStandardTransform stransform = (ModelStandardTransform)transform; + if (stransform.getDirection() != ModelStandardTransform.DIRECTION_MIN2MAX) + return false; + if (stransform.getPolarity() != ModelStandardTransform.POLARITY_UNIPOLAR) + return false; + if (stransform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + return false; + return false; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftPointResampler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftPointResampler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses 0-order (nearest-neighbor) interpolation. + * + * @author Karl Helgason + */ +public class SoftPointResampler extends SoftAbstractResampler { + + public int getPadding() { + return 100; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + float ox_end = out_end; + if (pitchstep == 0) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = in[(int) ix]; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = in[(int) ix]; + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftProcess.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftProcess.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Control signal processor interface + * + * @author Karl Helgason + */ +public interface SoftProcess extends SoftControl { + + public void init(SoftSynthesizer synth); + + public double[] get(int instance, String name); + + public void processControlLogic(); + + public void reset(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftProvider.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiDevice.Info; +import javax.sound.midi.spi.MidiDeviceProvider; + +/** + * Software synthesizer provider class. + * + * @author Karl Helgason + */ +public class SoftProvider extends MidiDeviceProvider { + + protected final static Info softinfo = SoftSynthesizer.info; + private static Info[] softinfos = {softinfo}; + + public MidiDevice.Info[] getDeviceInfo() { + return softinfos; + } + + public MidiDevice getDevice(MidiDevice.Info info) { + if (info == softinfo) { + return new SoftSynthesizer(); + } + return null; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.TreeMap; + +import javax.sound.midi.MidiMessage; +import javax.sound.midi.Receiver; +import javax.sound.midi.ShortMessage; + +/** + * Software synthesizer MIDI receiver class. + * + * @author Karl Helgason + */ +public class SoftReceiver implements Receiver { + + protected boolean open = true; + private Object control_mutex; + private SoftSynthesizer synth; + protected TreeMap midimessages; + protected SoftMainMixer mainmixer; + + public SoftReceiver(SoftSynthesizer synth) { + this.control_mutex = synth.control_mutex; + this.synth = synth; + this.mainmixer = synth.getMainMixer(); + if (mainmixer != null) + this.midimessages = mainmixer.midimessages; + } + + public void send(MidiMessage message, long timeStamp) { + + synchronized (control_mutex) { + if (!open) + throw new IllegalStateException("Receiver is not open"); + } + + if (timeStamp != -1) { + synchronized (control_mutex) { + while (midimessages.get(timeStamp) != null) + timeStamp++; + if (message instanceof ShortMessage + && (((ShortMessage)message).getChannel() > 0xF)) { + midimessages.put(timeStamp, message.clone()); + } else { + midimessages.put(timeStamp, message.getMessage()); + } + } + } else { + mainmixer.processMessage(message); + } + } + + public void close() { + synchronized (control_mutex) { + open = false; + } + synth.removeReceiver(this); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftResampler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftResampler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Basic resampler interface. + * + * @author Karl Helgason + */ +public interface SoftResampler { + + public SoftResamplerStreamer openStreamer(); +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftResamplerStreamer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftResamplerStreamer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,38 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; + +/** + * Resampler stream interface. + * + * @author Karl Helgason + */ +public interface SoftResamplerStreamer extends ModelOscillatorStream { + + public void open(ModelWavetable osc, float outputsamplerate) + throws IOException; +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftReverb.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftReverb.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,515 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Arrays; + +/** + * Reverb effect based on allpass/comb filters. First audio is send to 8 + * parelled comb filters and then mixed together and then finally send thru 3 + * different allpass filters. + * + * @author Karl Helgason + */ +public class SoftReverb implements SoftAudioProcessor { + + private final static class Delay { + + private float[] delaybuffer; + private int rovepos = 0; + + public Delay() { + delaybuffer = null; + } + + public void setDelay(int delay) { + if (delay == 0) + delaybuffer = null; + else + delaybuffer = new float[delay]; + rovepos = 0; + } + + public void processReplace(float[] inout) { + if (delaybuffer == null) + return; + int len = inout.length; + int rnlen = delaybuffer.length; + int rovepos = this.rovepos; + + for (int i = 0; i < len; i++) { + float x = inout[i]; + inout[i] = delaybuffer[rovepos]; + delaybuffer[rovepos] = x; + if (++rovepos == rnlen) + rovepos = 0; + } + this.rovepos = rovepos; + } + } + + private final static class AllPass { + + private final float[] delaybuffer; + private final int delaybuffersize; + private int rovepos = 0; + private float feedback; + + public AllPass(int size) { + delaybuffer = new float[size]; + delaybuffersize = size; + } + + public void setFeedBack(float feedback) { + this.feedback = feedback; + } + + public void processReplace(float inout[]) { + int len = inout.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + float input = inout[i]; + inout[i] = delayout - input; + delaybuffer[rovepos] = input + delayout * feedback; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.rovepos = rovepos; + } + + public void processReplace(float in[], float out[]) { + int len = in.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + float input = in[i]; + out[i] = delayout - input; + delaybuffer[rovepos] = input + delayout * feedback; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.rovepos = rovepos; + } + } + + private final static class Comb { + + private final float[] delaybuffer; + private final int delaybuffersize; + private int rovepos = 0; + private float feedback; + private float filtertemp = 0; + private float filtercoeff1 = 0; + private float filtercoeff2 = 1; + + public Comb(int size) { + delaybuffer = new float[size]; + delaybuffersize = size; + } + + public void setFeedBack(float feedback) { + this.feedback = feedback; + filtercoeff2 = (1 - filtercoeff1)* feedback; + } + + public void processMix(float in[], float out[]) { + int len = in.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + float filtertemp = this.filtertemp; + float filtercoeff1 = this.filtercoeff1; + float filtercoeff2 = this.filtercoeff2; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + // One Pole Lowpass Filter + filtertemp = (delayout * filtercoeff2) + + (filtertemp * filtercoeff1); + out[i] += delayout; + delaybuffer[rovepos] = in[i] + filtertemp; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.filtertemp = filtertemp; + this.rovepos = rovepos; + } + + public void processReplace(float in[], float out[]) { + int len = in.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + float filtertemp = this.filtertemp; + float filtercoeff1 = this.filtercoeff1; + float filtercoeff2 = this.filtercoeff2; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + // One Pole Lowpass Filter + filtertemp = (delayout * filtercoeff2) + + (filtertemp * filtercoeff1); + out[i] = delayout; + delaybuffer[rovepos] = in[i] + filtertemp; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.filtertemp = filtertemp; + this.rovepos = rovepos; + } + + public void setDamp(float val) { + filtercoeff1 = val; + filtercoeff2 = (1 - filtercoeff1)* feedback; + } + } + private float roomsize; + private float damp; + private float gain = 1; + private Delay delay; + private Comb[] combL; + private Comb[] combR; + private AllPass[] allpassL; + private AllPass[] allpassR; + private float[] input; + private float[] out; + private float[] pre1; + private float[] pre2; + private float[] pre3; + private boolean denormal_flip = false; + private boolean mix = true; + private SoftAudioBuffer inputA; + private SoftAudioBuffer left; + private SoftAudioBuffer right; + private boolean dirty = true; + private float dirty_roomsize; + private float dirty_damp; + private float dirty_predelay; + private float dirty_gain; + private float samplerate; + private boolean light = true; + + public void init(float samplerate, float controlrate) { + this.samplerate = samplerate; + + double freqscale = ((double) samplerate) / 44100.0; + // freqscale = 1.0/ freqscale; + + int stereospread = 23; + + delay = new Delay(); + + combL = new Comb[8]; + combR = new Comb[8]; + combL[0] = new Comb((int) (freqscale * (1116))); + combR[0] = new Comb((int) (freqscale * (1116 + stereospread))); + combL[1] = new Comb((int) (freqscale * (1188))); + combR[1] = new Comb((int) (freqscale * (1188 + stereospread))); + combL[2] = new Comb((int) (freqscale * (1277))); + combR[2] = new Comb((int) (freqscale * (1277 + stereospread))); + combL[3] = new Comb((int) (freqscale * (1356))); + combR[3] = new Comb((int) (freqscale * (1356 + stereospread))); + combL[4] = new Comb((int) (freqscale * (1422))); + combR[4] = new Comb((int) (freqscale * (1422 + stereospread))); + combL[5] = new Comb((int) (freqscale * (1491))); + combR[5] = new Comb((int) (freqscale * (1491 + stereospread))); + combL[6] = new Comb((int) (freqscale * (1557))); + combR[6] = new Comb((int) (freqscale * (1557 + stereospread))); + combL[7] = new Comb((int) (freqscale * (1617))); + combR[7] = new Comb((int) (freqscale * (1617 + stereospread))); + + allpassL = new AllPass[4]; + allpassR = new AllPass[4]; + allpassL[0] = new AllPass((int) (freqscale * (556))); + allpassR[0] = new AllPass((int) (freqscale * (556 + stereospread))); + allpassL[1] = new AllPass((int) (freqscale * (441))); + allpassR[1] = new AllPass((int) (freqscale * (441 + stereospread))); + allpassL[2] = new AllPass((int) (freqscale * (341))); + allpassR[2] = new AllPass((int) (freqscale * (341 + stereospread))); + allpassL[3] = new AllPass((int) (freqscale * (225))); + allpassR[3] = new AllPass((int) (freqscale * (225 + stereospread))); + + for (int i = 0; i < allpassL.length; i++) { + allpassL[i].setFeedBack(0.5f); + allpassR[i].setFeedBack(0.5f); + } + + /* Init other settings */ + globalParameterControlChange(new int[]{0x01 * 128 + 0x01}, 0, 4); + + } + + public void setInput(int pin, SoftAudioBuffer input) { + if (pin == 0) + inputA = input; + } + + public void setOutput(int pin, SoftAudioBuffer output) { + if (pin == 0) + left = output; + if (pin == 1) + right = output; + } + + public void setMixMode(boolean mix) { + this.mix = mix; + } + + private boolean silent = true; + + public void processAudio() { + boolean silent_input = this.inputA.isSilent(); + if(!silent_input) + silent = false; + if(silent) + { + if (!mix) { + left.clear(); + right.clear(); + } + return; + } + + float[] inputA = this.inputA.array(); + float[] left = this.left.array(); + float[] right = this.right == null ? null : this.right.array(); + + int numsamples = inputA.length; + if (input == null || input.length < numsamples) + input = new float[numsamples]; + + float again = gain * 0.018f / 2; + + denormal_flip = !denormal_flip; + if(denormal_flip) + for (int i = 0; i < numsamples; i++) + input[i] = inputA[i] * again + 1E-20f; + else + for (int i = 0; i < numsamples; i++) + input[i] = inputA[i] * again - 1E-20f; + + delay.processReplace(input); + + if(light && (right != null)) + { + if (pre1 == null || pre1.length < numsamples) + { + pre1 = new float[numsamples]; + pre2 = new float[numsamples]; + pre3 = new float[numsamples]; + } + + for (int i = 0; i < allpassL.length; i++) + allpassL[i].processReplace(input); + + combL[0].processReplace(input, pre3); + combL[1].processReplace(input, pre3); + + combL[2].processReplace(input, pre1); + for (int i = 4; i < combL.length-2; i+=2) + combL[i].processMix(input, pre1); + + combL[3].processReplace(input, pre2);; + for (int i = 5; i < combL.length-2; i+=2) + combL[i].processMix(input, pre2); + + if (!mix) + { + Arrays.fill(right, 0); + Arrays.fill(left, 0); + } + for (int i = combR.length-2; i < combR.length; i++) + combR[i].processMix(input, right); + for (int i = combL.length-2; i < combL.length; i++) + combL[i].processMix(input, left); + + for (int i = 0; i < numsamples; i++) + { + float p = pre1[i] - pre2[i]; + float m = pre3[i]; + left[i] += m + p; + right[i] += m - p; + } + } + else + { + if (out == null || out.length < numsamples) + out = new float[numsamples]; + + if (right != null) { + if (!mix) + Arrays.fill(right, 0); + allpassR[0].processReplace(input, out); + for (int i = 1; i < allpassR.length; i++) + allpassR[i].processReplace(out); + for (int i = 0; i < combR.length; i++) + combR[i].processMix(out, right); + } + + if (!mix) + Arrays.fill(left, 0); + allpassL[0].processReplace(input, out); + for (int i = 1; i < allpassL.length; i++) + allpassL[i].processReplace(out); + for (int i = 0; i < combL.length; i++) + combL[i].processMix(out, left); + } + + + + + + + if (silent_input) { + silent = true; + for (int i = 0; i < numsamples; i++) + { + float v = left[i]; + if(v > 1E-10 || v < -1E-10) + { + silent = false; + break; + } + } + } + + } + + public void globalParameterControlChange(int[] slothpath, long param, + long value) { + if (slothpath.length == 1) { + if (slothpath[0] == 0x01 * 128 + 0x01) { + + if (param == 0) { + if (value == 0) { + // Small Room A small size room with a length + // of 5m or so. + dirty_roomsize = (1.1f); + dirty_damp = (5000); + dirty_predelay = (0); + dirty_gain = (4); + dirty = true; + } + if (value == 1) { + // Medium Room A medium size room with a length + // of 10m or so. + dirty_roomsize = (1.3f); + dirty_damp = (5000); + dirty_predelay = (0); + dirty_gain = (3); + dirty = true; + } + if (value == 2) { + // Large Room A large size room suitable for + // live performances. + dirty_roomsize = (1.5f); + dirty_damp = (5000); + dirty_predelay = (0); + dirty_gain = (2); + dirty = true; + } + if (value == 3) { + // Medium Hall A medium size concert hall. + dirty_roomsize = (1.8f); + dirty_damp = (24000); + dirty_predelay = (0.02f); + dirty_gain = (1.5f); + dirty = true; + } + if (value == 4) { + // Large Hall A large size concert hall + // suitable for a full orchestra. + dirty_roomsize = (1.8f); + dirty_damp = (24000); + dirty_predelay = (0.03f); + dirty_gain = (1.5f); + dirty = true; + } + if (value == 8) { + // Plate A plate reverb simulation. + dirty_roomsize = (1.3f); + dirty_damp = (2500); + dirty_predelay = (0); + dirty_gain = (6); + dirty = true; + } + } else if (param == 1) { + dirty_roomsize = ((float) (Math.exp((value - 40) * 0.025))); + dirty = true; + } + + } + } + } + + public void processControlLogic() { + if (dirty) { + dirty = false; + setRoomSize(dirty_roomsize); + setDamp(dirty_damp); + setPreDelay(dirty_predelay); + setGain(dirty_gain); + } + } + + public void setRoomSize(float value) { + roomsize = 1 - (0.17f / value); + + for (int i = 0; i < combL.length; i++) { + combL[i].feedback = roomsize; + combR[i].feedback = roomsize; + } + } + + public void setPreDelay(float value) { + delay.setDelay((int)(value * samplerate)); + } + + public void setGain(float gain) { + this.gain = gain; + } + + public void setDamp(float value) { + double x = (value / samplerate) * (2 * Math.PI); + double cx = 2 - Math.cos(x); + damp = (float)(cx - Math.sqrt(cx * cx - 1)); + if (damp > 1) + damp = 1; + if (damp < 0) + damp = 0; + + // damp = value * 0.4f; + for (int i = 0; i < combL.length; i++) { + combL[i].setDamp(damp); + combR[i].setDamp(damp); + } + + } + + public void setLightMode(boolean light) + { + this.light = light; + } +} + diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftShortMessage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftShortMessage.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.ShortMessage; + +/** + * A short message class that support for than 16 midi channels. + * + * @author Karl Helgason + */ +public class SoftShortMessage extends ShortMessage { + + int channel = 0; + + public int getChannel() { + return channel; + } + + public void setMessage(int command, int channel, int data1, int data2) + throws InvalidMidiDataException { + this.channel = channel; + super.setMessage(command, channel & 0xF, data1, data2); + } + + public Object clone() { + SoftShortMessage clone = new SoftShortMessage(); + try { + clone.setMessage(getCommand(), getChannel(), getData1(), getData2()); + } catch (InvalidMidiDataException e) { + throw new IllegalArgumentException(e); + } + return clone; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftSincResampler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftSincResampler.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,139 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Hann windowed sinc interpolation resampler with anti-alias filtering. + * + * Using 30 points for the interpolation. + * + * @author Karl Helgason + */ +public class SoftSincResampler extends SoftAbstractResampler { + + float[][][] sinc_table; + int sinc_scale_size = 100; + int sinc_table_fsize = 800; + int sinc_table_size = 30; + int sinc_table_center = sinc_table_size / 2; + + public SoftSincResampler() { + super(); + sinc_table = new float[sinc_scale_size][sinc_table_fsize][]; + for (int s = 0; s < sinc_scale_size; s++) { + float scale = (float) (1.0 / (1.0 + Math.pow(s, 1.1) / 10.0)); + for (int i = 0; i < sinc_table_fsize; i++) { + sinc_table[s][i] = sincTable(sinc_table_size, + -i / ((float)sinc_table_fsize), scale); + } + } + } + + // Normalized sinc function + public static double sinc(double x) { + return (x == 0.0) ? 1.0 : Math.sin(Math.PI * x) / (Math.PI * x); + } + + // Generate hann window suitable for windowing sinc + public static float[] wHanning(int size, float offset) { + float[] window_table = new float[size]; + for (int k = 0; k < size; k++) { + window_table[k] = (float)(-0.5 + * Math.cos(2.0 * Math.PI * (double)(k + offset) + / (double) size) + 0.5); + } + return window_table; + } + + // Generate sinc table + public static float[] sincTable(int size, float offset, float scale) { + int center = size / 2; + float[] w = wHanning(size, offset); + for (int k = 0; k < size; k++) + w[k] *= sinc((-center + k + offset) * scale) * scale; + return w; + } + + public int getPadding() // must be at least half of sinc_table_size + { + return sinc_table_size / 2 + 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + int max_p = sinc_scale_size - 1; + if (pitchstep == 0) { + + int p = (int) ((pitch - 1) * 10.0f); + if (p < 0) + p = 0; + else if (p > max_p) + p = max_p; + float[][] sinc_table_f = this.sinc_table[p]; + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float[] sinc_table = + sinc_table_f[(int)((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + int p = (int) ((pitch - 1) * 10.0f); + if (p < 0) + p = 0; + else if (p > max_p) + p = max_p; + float[][] sinc_table_f = this.sinc_table[p]; + + float[] sinc_table = + sinc_table_f[(int)((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,1179 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.ref.WeakReference; +import java.security.AccessControlException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.midi.Soundbank; +import javax.sound.midi.Transmitter; +import javax.sound.midi.VoiceStatus; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; + +/** + * The software synthesizer class. + * + * @author Karl Helgason + */ +public class SoftSynthesizer implements AudioSynthesizer, + ReferenceCountingDevice { + + protected static class WeakAudioStream extends InputStream + { + private volatile AudioInputStream stream; + public SoftAudioPusher pusher = null; + public AudioInputStream jitter_stream = null; + public SourceDataLine sourceDataLine = null; + private WeakReference weak_stream_link; + private AudioFloatConverter converter; + private float[] silentbuffer = null; + private int samplesize; + + public void setInputStream(AudioInputStream stream) + { + this.stream = stream; + } + + public int available() throws IOException { + AudioInputStream local_stream = stream; + if(local_stream != null) + return local_stream.available(); + return 0; + } + + public int read() throws IOException { + byte[] b = new byte[1]; + if (read(b) == -1) + return -1; + return b[0] & 0xFF; + } + + public int read(byte[] b, int off, int len) throws IOException { + AudioInputStream local_stream = stream; + if(local_stream != null) + return local_stream.read(b, off, len); + else + { + int flen = len / samplesize; + if(silentbuffer == null || silentbuffer.length < flen) + silentbuffer = new float[flen]; + converter.toByteArray(silentbuffer, flen, b, off); + + if(pusher != null) + if(weak_stream_link.get() == null) + { + Runnable runnable = new Runnable() + { + SoftAudioPusher _pusher = pusher; + AudioInputStream _jitter_stream = jitter_stream; + SourceDataLine _sourceDataLine = sourceDataLine; + public void run() + { + _pusher.stop(); + if(_jitter_stream != null) + try { + _jitter_stream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + if(_sourceDataLine != null) + _sourceDataLine.close(); + } + }; + pusher = null; + jitter_stream = null; + sourceDataLine = null; + new Thread(runnable).start(); + } + return len; + } + } + + public WeakAudioStream(AudioInputStream stream) { + this.stream = stream; + weak_stream_link = new WeakReference(stream); + converter = AudioFloatConverter.getConverter(stream.getFormat()); + samplesize = stream.getFormat().getFrameSize() / stream.getFormat().getChannels(); + } + + public AudioInputStream getAudioInputStream() + { + return new AudioInputStream(this, stream.getFormat(), AudioSystem.NOT_SPECIFIED); + } + + public void close() throws IOException + { + AudioInputStream astream = weak_stream_link.get(); + if(astream != null) + astream.close(); + } + } + + private static class Info extends MidiDevice.Info { + public Info() { + super(INFO_NAME, INFO_VENDOR, INFO_DESCRIPTION, INFO_VERSION); + } + } + + protected static final String INFO_NAME = "Gervill"; + protected static final String INFO_VENDOR = "OpenJDK"; + protected static final String INFO_DESCRIPTION = "Software MIDI Synthesizer"; + protected static final String INFO_VERSION = "1.0"; + protected final static MidiDevice.Info info = new Info(); + + private static SourceDataLine testline = null; + + private static Soundbank defaultSoundBank = null; + + protected WeakAudioStream weakstream = null; + + protected Object control_mutex = this; + + protected int voiceIDCounter = 0; + + // 0: default + // 1: DLS Voice Allocation + protected int voice_allocation_mode = 0; + + protected boolean reverb_light = true; + protected boolean reverb_on = true; + protected boolean chorus_on = true; + protected boolean agc_on = true; + + protected SoftChannel[] channels; + protected SoftChannelProxy[] external_channels = null; + + private boolean largemode = false; + + // 0: GM Mode off (default) + // 1: GM Level 1 + // 2: GM Level 2 + private int gmmode = 0; + + private int deviceid = 0; + + private AudioFormat format = new AudioFormat(44100, 16, 2, true, false); + + private SourceDataLine sourceDataLine = null; + + private SoftAudioPusher pusher = null; + private AudioInputStream pusher_stream = null; + + private float controlrate = 147f; + + private boolean open = false; + private boolean implicitOpen = false; + + private String resamplerType = "linear"; + private SoftResampler resampler = new SoftLinearResampler(); + + private int number_of_midi_channels = 16; + private int maxpoly = 64; + private long latency = 200000; // 200 msec + private boolean jitter_correction = false; + + private SoftMainMixer mainmixer; + private SoftVoice[] voices; + + private Map tunings + = new HashMap(); + private Map inslist + = new HashMap(); + private Map availlist + = new HashMap(); + private Map loadedlist + = new HashMap(); + + private ArrayList recvslist = new ArrayList(); + + private void getBuffers(ModelInstrument instrument, + List buffers) { + for (ModelPerformer performer : instrument.getPerformers()) { + if (performer.getOscillators() != null) { + for (ModelOscillator osc : performer.getOscillators()) { + if (osc instanceof ModelByteBufferWavetable) { + ModelByteBufferWavetable w = (ModelByteBufferWavetable)osc; + ModelByteBuffer buff = w.getBuffer(); + if (buff != null) + buffers.add(buff); + buff = w.get8BitExtensionBuffer(); + if (buff != null) + buffers.add(buff); + } + } + } + } + } + + private boolean loadSamples(List instruments) { + if (largemode) + return true; + List buffers = new ArrayList(); + for (ModelInstrument instrument : instruments) + getBuffers(instrument, buffers); + try { + ModelByteBuffer.loadAll(buffers); + } catch (IOException e) { + return false; + } + return true; + } + + private boolean loadInstruments(List instruments) { + if (!isOpen()) + return false; + if (!loadSamples(instruments)) + return false; + + synchronized (control_mutex) { + if (channels != null) + for (SoftChannel c : channels) + c.current_instrument = null; + for (Instrument instrument : instruments) { + String pat = patchToString(instrument.getPatch()); + availlist.remove(pat); + SoftInstrument softins + = new SoftInstrument((ModelInstrument) instrument); + inslist.put(pat, softins); + loadedlist.put(pat, (ModelInstrument) instrument); + } + } + + return true; + } + + private void processPropertyInfo(Map info) { + AudioSynthesizerPropertyInfo[] items = getPropertyInfo(info); + + String resamplerType = (String)items[0].value; + if (resamplerType.equalsIgnoreCase("point")) + { + this.resampler = new SoftPointResampler(); + this.resamplerType = "point"; + } + else if (resamplerType.equalsIgnoreCase("linear")) + { + this.resampler = new SoftLinearResampler2(); + this.resamplerType = "linear"; + } + else if (resamplerType.equalsIgnoreCase("linear1")) + { + this.resampler = new SoftLinearResampler(); + this.resamplerType = "linear1"; + } + else if (resamplerType.equalsIgnoreCase("linear2")) + { + this.resampler = new SoftLinearResampler2(); + this.resamplerType = "linear2"; + } + else if (resamplerType.equalsIgnoreCase("cubic")) + { + this.resampler = new SoftCubicResampler(); + this.resamplerType = "cubic"; + } + else if (resamplerType.equalsIgnoreCase("lanczos")) + { + this.resampler = new SoftLanczosResampler(); + this.resamplerType = "lanczos"; + } + else if (resamplerType.equalsIgnoreCase("sinc")) + { + this.resampler = new SoftSincResampler(); + this.resamplerType = "sinc"; + } + + setFormat((AudioFormat)items[2].value); + controlrate = (Float)items[1].value; + latency = (Long)items[3].value; + deviceid = (Integer)items[4].value; + maxpoly = (Integer)items[5].value; + reverb_on = (Boolean)items[6].value; + chorus_on = (Boolean)items[7].value; + agc_on = (Boolean)items[8].value; + largemode = (Boolean)items[9].value; + number_of_midi_channels = (Integer)items[10].value; + jitter_correction = (Boolean)items[11].value; + reverb_light = (Boolean)items[12].value; + } + + private String patchToString(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch) patch).isPercussion()) + return "p." + patch.getProgram() + "." + patch.getBank(); + else + return patch.getProgram() + "." + patch.getBank(); + } + + private void setFormat(AudioFormat format) { + if (format.getChannels() > 2) { + throw new IllegalArgumentException( + "Only mono and stereo audio supported."); + } + if (AudioFloatConverter.getConverter(format) == null) + throw new IllegalArgumentException("Audio format not supported."); + this.format = format; + } + + protected void removeReceiver(Receiver recv) { + boolean perform_close = false; + synchronized (control_mutex) { + if (recvslist.remove(recv)) { + if (implicitOpen && recvslist.isEmpty()) + perform_close = true; + } + } + if (perform_close) + close(); + } + + protected SoftMainMixer getMainMixer() { + if (!isOpen()) + return null; + return mainmixer; + } + + protected SoftInstrument findInstrument(int program, int bank, int channel) { + + // Add support for GM2 banks 0x78 and 0x79 + // as specified in DLS 2.2 in Section 1.4.6 + // which allows using percussion and melodic instruments + // on all channels + if (bank >> 7 == 0x78 || bank >> 7 == 0x79) { + SoftInstrument current_instrument + = inslist.get(program + "." + bank); + if (current_instrument != null) + return current_instrument; + + String p_plaf; + if (bank >> 7 == 0x78) + p_plaf = "p."; + else + p_plaf = ""; + + // Instrument not found fallback to MSB:bank, LSB:0 + current_instrument = inslist.get(p_plaf + program + "." + + ((bank & 128) << 7)); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:bank + current_instrument = inslist.get(p_plaf + program + "." + + (bank & 128)); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0 + current_instrument = inslist.get(p_plaf + program + ".0"); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0, program=0 + current_instrument = inslist.get(p_plaf + program + "0.0"); + if (current_instrument != null) + return current_instrument; + return null; + } + + // Channel 10 uses percussion instruments + String p_plaf; + if (channel == 9) + p_plaf = "p."; + else + p_plaf = ""; + + SoftInstrument current_instrument + = inslist.get(p_plaf + program + "." + bank); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0 + current_instrument = inslist.get(p_plaf + program + ".0"); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0, program=0 + current_instrument = inslist.get(p_plaf + "0.0"); + if (current_instrument != null) + return current_instrument; + return null; + } + + protected int getVoiceAllocationMode() { + return voice_allocation_mode; + } + + protected int getGeneralMidiMode() { + return gmmode; + } + + protected void setGeneralMidiMode(int gmmode) { + this.gmmode = gmmode; + } + + protected int getDeviceID() { + return deviceid; + } + + protected float getControlRate() { + return controlrate; + } + + protected SoftVoice[] getVoices() { + return voices; + } + + protected SoftTuning getTuning(Patch patch) { + String t_id = patchToString(patch); + SoftTuning tuning = tunings.get(t_id); + if (tuning == null) { + tuning = new SoftTuning(patch); + tunings.put(t_id, tuning); + } + return tuning; + } + + public long getLatency() { + synchronized (control_mutex) { + return latency; + } + } + + public AudioFormat getFormat() { + synchronized (control_mutex) { + return format; + } + } + + public int getMaxPolyphony() { + synchronized (control_mutex) { + return maxpoly; + } + } + + public MidiChannel[] getChannels() { + + synchronized (control_mutex) { + // if (external_channels == null) => the synthesizer is not open, + // create 16 proxy channels + // otherwise external_channels has the same length as channels array + if (external_channels == null) { + external_channels = new SoftChannelProxy[16]; + for (int i = 0; i < external_channels.length; i++) + external_channels[i] = new SoftChannelProxy(); + } + MidiChannel[] ret; + if (isOpen()) + ret = new MidiChannel[channels.length]; + else + ret = new MidiChannel[16]; + for (int i = 0; i < ret.length; i++) + ret[i] = external_channels[i]; + return ret; + } + } + + public VoiceStatus[] getVoiceStatus() { + if (!isOpen()) { + VoiceStatus[] tempVoiceStatusArray + = new VoiceStatus[getMaxPolyphony()]; + for (int i = 0; i < tempVoiceStatusArray.length; i++) { + VoiceStatus b = new VoiceStatus(); + b.active = false; + b.bank = 0; + b.channel = 0; + b.note = 0; + b.program = 0; + b.volume = 0; + tempVoiceStatusArray[i] = b; + } + return tempVoiceStatusArray; + } + + synchronized (control_mutex) { + VoiceStatus[] tempVoiceStatusArray = new VoiceStatus[voices.length]; + for (int i = 0; i < voices.length; i++) { + VoiceStatus a = voices[i]; + VoiceStatus b = new VoiceStatus(); + b.active = a.active; + b.bank = a.bank; + b.channel = a.channel; + b.note = a.note; + b.program = a.program; + b.volume = a.volume; + tempVoiceStatusArray[i] = b; + } + return tempVoiceStatusArray; + } + } + + public boolean isSoundbankSupported(Soundbank soundbank) { + for (Instrument ins: soundbank.getInstruments()) + if (!(ins instanceof ModelInstrument)) + return false; + return true; + } + + public boolean loadInstrument(Instrument instrument) { + if (instrument == null || (!(instrument instanceof ModelInstrument))) { + throw new IllegalArgumentException("Unsupported instrument: " + + instrument); + } + List instruments = new ArrayList(); + instruments.add((ModelInstrument)instrument); + return loadInstruments(instruments); + } + + public void unloadInstrument(Instrument instrument) { + if (instrument == null || (!(instrument instanceof ModelInstrument))) { + throw new IllegalArgumentException("Unsupported instrument: " + + instrument); + } + if (!isOpen()) + return; + + String pat = patchToString(instrument.getPatch()); + synchronized (control_mutex) { + for (SoftChannel c: channels) + c.current_instrument = null; + inslist.remove(pat); + loadedlist.remove(pat); + availlist.remove(pat); + } + } + + public boolean remapInstrument(Instrument from, Instrument to) { + + if (from == null) + throw new NullPointerException(); + if (to == null) + throw new NullPointerException(); + if (!(from instanceof ModelInstrument)) { + throw new IllegalArgumentException("Unsupported instrument: " + + from.toString()); + } + if (!(to instanceof ModelInstrument)) { + throw new IllegalArgumentException("Unsupported instrument: " + + to.toString()); + } + if (!isOpen()) + return false; + + synchronized (control_mutex) { + if (!loadedlist.containsValue(to) && !availlist.containsValue(to)) + throw new IllegalArgumentException("Instrument to is not loaded."); + unloadInstrument(from); + ModelMappedInstrument mfrom = new ModelMappedInstrument( + (ModelInstrument)to, from.getPatch()); + return loadInstrument(mfrom); + } + } + + public synchronized Soundbank getDefaultSoundbank() { + if (defaultSoundBank == null) { + try { + File javahome = new File(System.getProperties().getProperty( + "java.home")); + File libaudio = new File(new File(javahome, "lib"), "audio"); + + if (libaudio.exists()) { + File foundfile = null; + File[] files = libaudio.listFiles(); + if (files != null) { + for (int i = 0; i < files.length; i++) { + File file = files[i]; + if (file.isFile()) { + String lname = file.getName().toLowerCase(); + if (lname.endsWith(".sf2") || + lname.endsWith(".dls")) { + if (foundfile == null || (file.length() > + foundfile.length())) { + foundfile = file; + } + } + } + } + } + if (foundfile != null) { + try { + Soundbank sbk = MidiSystem.getSoundbank(foundfile); + defaultSoundBank = sbk; + return defaultSoundBank; + } catch (Exception e) { + //e.printStackTrace(); + } + } + } + + if (System.getProperties().getProperty("os.name") + .startsWith("Windows")) { + File gm_dls = new File(System.getenv("SystemRoot") + + "\\system32\\drivers\\gm.dls"); + if (gm_dls.exists()) { + try { + Soundbank sbk = MidiSystem.getSoundbank(gm_dls); + defaultSoundBank = sbk; + return defaultSoundBank; + } catch (Exception e) { + //e.printStackTrace(); + } + } + } + } catch (AccessControlException e) { + } catch (Exception e) { + //e.printStackTrace(); + } + + File userhome = null; + File emg_soundbank_file = null; + + /* + * Try to load saved generated soundbank + */ + try { + userhome = new File(System.getProperty("user.home"), + ".gervill"); + emg_soundbank_file = new File(userhome, "soundbank-emg.sf2"); + Soundbank sbk = MidiSystem.getSoundbank(emg_soundbank_file); + defaultSoundBank = sbk; + return defaultSoundBank; + } catch (AccessControlException e) { + } catch (Exception e) { + //e.printStackTrace(); + } + + try { + + /* + * Generate emergency soundbank + */ + defaultSoundBank = EmergencySoundbank.createSoundbank(); + + /* + * Save generated soundbank to disk for faster future use. + */ + if(defaultSoundBank != null) + { + if(!userhome.exists()) userhome.mkdirs(); + if(!emg_soundbank_file.exists()) + ((SF2Soundbank)defaultSoundBank).save(emg_soundbank_file); + } + } catch (Exception e) { + //e.printStackTrace(); + } + + } + return defaultSoundBank; + } + + public Instrument[] getAvailableInstruments() { + if (!isOpen()) { + Soundbank defsbk = getDefaultSoundbank(); + if (defsbk == null) + return new Instrument[0]; + return defsbk.getInstruments(); + } + + synchronized (control_mutex) { + ModelInstrument[] inslist_array = + new ModelInstrument[availlist.values().size()]; + availlist.values().toArray(inslist_array); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + } + + public Instrument[] getLoadedInstruments() { + if (!isOpen()) + return new Instrument[0]; + + synchronized (control_mutex) { + ModelInstrument[] inslist_array = + new ModelInstrument[loadedlist.values().size()]; + loadedlist.values().toArray(inslist_array); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + } + + public boolean loadAllInstruments(Soundbank soundbank) { + List instruments = new ArrayList(); + for (Instrument ins: soundbank.getInstruments()) { + if (ins == null || !(ins instanceof ModelInstrument)) { + throw new IllegalArgumentException( + "Unsupported instrument: " + ins); + } + instruments.add((ModelInstrument)ins); + } + return loadInstruments(instruments); + } + + public void unloadAllInstruments(Soundbank soundbank) { + if (soundbank == null || !isSoundbankSupported(soundbank)) + throw new IllegalArgumentException("Unsupported soundbank: " + soundbank); + + if (!isOpen()) + return; + + for (Instrument ins: soundbank.getInstruments()) { + if (ins instanceof ModelInstrument) { + unloadInstrument(ins); + } + } + } + + public boolean loadInstruments(Soundbank soundbank, Patch[] patchList) { + List instruments = new ArrayList(); + for (Patch patch: patchList) { + Instrument ins = soundbank.getInstrument(patch); + if (ins == null || !(ins instanceof ModelInstrument)) { + throw new IllegalArgumentException( + "Unsupported instrument: " + ins); + } + instruments.add((ModelInstrument)ins); + } + return loadInstruments(instruments); + } + + public void unloadInstruments(Soundbank soundbank, Patch[] patchList) { + if (soundbank == null || !isSoundbankSupported(soundbank)) + throw new IllegalArgumentException("Unsupported soundbank: " + soundbank); + + if (!isOpen()) + return; + + for (Patch pat: patchList) { + Instrument ins = soundbank.getInstrument(pat); + if (ins instanceof ModelInstrument) { + unloadInstrument(ins); + } + } + } + + public MidiDevice.Info getDeviceInfo() { + return info; + } + + public AudioSynthesizerPropertyInfo[] getPropertyInfo(Map info) { + List list = + new ArrayList(); + + AudioSynthesizerPropertyInfo item; + + // If info != null or synthesizer is closed + // we return how the synthesizer will be set on next open + // If info == null and synthesizer is open + // we return current synthesizer properties. + boolean o = info == null && open; + + item = new AudioSynthesizerPropertyInfo("interpolation", o?resamplerType:"linear"); + item.choices = new String[]{"linear", "linear1", "linear2", "cubic", + "lanczos", "sinc", "point"}; + item.description = "Interpolation method"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("control rate", o?controlrate:147f); + item.description = "Control rate"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("format", + o?format:new AudioFormat(44100, 16, 2, true, false)); + item.description = "Default audio format"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("latency", o?latency:120000L); + item.description = "Default latency"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("device id", o?deviceid:0); + item.description = "Device ID for SysEx Messages"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("max polyphony", o?maxpoly:64); + item.description = "Maximum polyphony"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("reverb", o?reverb_on:true); + item.description = "Turn reverb effect on or off"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("chorus", o?chorus_on:true); + item.description = "Turn chorus effect on or off"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("auto gain control", o?agc_on:true); + item.description = "Turn auto gain control on or off"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("large mode", o?largemode:false); + item.description = "Turn large mode on or off."; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("midi channels", o?channels.length:16); + item.description = "Number of midi channels."; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("jitter correction", o?jitter_correction:true); + item.description = "Turn jitter correction on or off."; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("light reverb", o?reverb_light:true); + item.description = "Turn light reverb mode on or off"; + list.add(item); + + AudioSynthesizerPropertyInfo[] items; + items = list.toArray(new AudioSynthesizerPropertyInfo[list.size()]); + + if (info != null) + for (AudioSynthesizerPropertyInfo item2: items) { + Object v = info.get(item2.name); + Class c = (item2.valueClass); + if (v != null) + if (c.isInstance(v)) + item2.value = v; + } + + return items; + } + + public void open() throws MidiUnavailableException { + if (isOpen()) { + synchronized (control_mutex) { + implicitOpen = false; + } + return; + } + open(null, null); + } + + public void open(SourceDataLine line, Map info) throws MidiUnavailableException { + if (isOpen()) { + synchronized (control_mutex) { + implicitOpen = false; + } + return; + } + synchronized (control_mutex) { + try { + if (line != null) + setFormat(line.getFormat()); + + AudioInputStream ais = openStream(getFormat(), info); + + weakstream = new WeakAudioStream(ais); + ais = weakstream.getAudioInputStream(); + + if (line == null) + { + if(testline != null) + line = testline; + else + line = AudioSystem.getSourceDataLine(getFormat()); + } + + double latency = this.latency; + + if (!line.isOpen()) { + int bufferSize = getFormat().getFrameSize() + * (int)(getFormat().getFrameRate() * (latency/1000000f)); + line.open(getFormat(), bufferSize); + + // Remember that we opened that line + // so we can close again in SoftSynthesizer.close() + sourceDataLine = line; + } + if (!line.isActive()) + line.start(); + + int controlbuffersize = 512; + try { + controlbuffersize = ais.available(); + } catch (IOException e) { + } + + // Tell mixer not fill read buffers fully. + // This lowers latency, and tells DataPusher + // to read in smaller amounts. + //mainmixer.readfully = false; + //pusher = new DataPusher(line, ais); + + int buffersize = line.getBufferSize(); + buffersize -= buffersize % controlbuffersize; + + if (buffersize < 3 * controlbuffersize) + buffersize = 3 * controlbuffersize; + + if (jitter_correction) { + ais = new SoftJitterCorrector(ais, buffersize, + controlbuffersize); + if(weakstream != null) + weakstream.jitter_stream = ais; + } + pusher = new SoftAudioPusher(line, ais, controlbuffersize); + pusher_stream = ais; + pusher.start(); + + if(weakstream != null) + { + weakstream.pusher = pusher; + weakstream.sourceDataLine = sourceDataLine; + } + + + + } catch (LineUnavailableException e) { + if (isOpen()) + close(); + // am: need MidiUnavailableException(Throwable) ctor! + throw new MidiUnavailableException(e.toString()); + } + + } + } + + public AudioInputStream openStream(AudioFormat targetFormat, + Map info) throws MidiUnavailableException { + + if (isOpen()) + throw new MidiUnavailableException("Synthesizer is already open"); + + synchronized (control_mutex) { + + gmmode = 0; + voice_allocation_mode = 0; + + processPropertyInfo(info); + + open = true; + implicitOpen = false; + + if (targetFormat != null) + setFormat(targetFormat); + + Soundbank defbank = getDefaultSoundbank(); + if (defbank != null) { + loadAllInstruments(defbank); + availlist.putAll(loadedlist); + loadedlist.clear(); + } + + voices = new SoftVoice[maxpoly]; + for (int i = 0; i < maxpoly; i++) + voices[i] = new SoftVoice(this); + + mainmixer = new SoftMainMixer(this); + + channels = new SoftChannel[number_of_midi_channels]; + for (int i = 0; i < channels.length; i++) + channels[i] = new SoftChannel(this, i); + + if (external_channels == null) { + // Always create external_channels array + // with 16 or more channels + // so getChannels works correctly + // when the synhtesizer is closed. + if (channels.length < 16) + external_channels = new SoftChannelProxy[16]; + else + external_channels = new SoftChannelProxy[channels.length]; + for (int i = 0; i < external_channels.length; i++) + external_channels[i] = new SoftChannelProxy(); + } else { + // We must resize external_channels array + // but we must also copy the old SoftChannelProxy + // into the new one + if (channels.length > external_channels.length) { + SoftChannelProxy[] new_external_channels + = new SoftChannelProxy[channels.length]; + for (int i = 0; i < external_channels.length; i++) + new_external_channels[i] = external_channels[i]; + for (int i = external_channels.length; + i < new_external_channels.length; i++) { + new_external_channels[i] = new SoftChannelProxy(); + } + } + } + + for (int i = 0; i < channels.length; i++) + external_channels[i].setChannel(channels[i]); + + for (SoftVoice voice: getVoices()) + voice.resampler = resampler.openStreamer(); + + for (Receiver recv: getReceivers()) { + SoftReceiver srecv = ((SoftReceiver)recv); + srecv.open = open; + srecv.mainmixer = mainmixer; + srecv.midimessages = mainmixer.midimessages; + } + + return mainmixer.getInputStream(); + } + } + + public void close() { + + if (!isOpen()) + return; + + SoftAudioPusher pusher_to_be_closed = null; + AudioInputStream pusher_stream_to_be_closed = null; + synchronized (control_mutex) { + if (pusher != null) { + pusher_to_be_closed = pusher; + pusher_stream_to_be_closed = pusher_stream; + pusher = null; + pusher_stream = null; + } + } + + if (pusher_to_be_closed != null) { + // Pusher must not be closed synchronized against control_mutex, + // this may result in synchronized conflict between pusher + // and current thread. + pusher_to_be_closed.stop(); + + try { + pusher_stream_to_be_closed.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + synchronized (control_mutex) { + + if (mainmixer != null) + mainmixer.close(); + open = false; + implicitOpen = false; + mainmixer = null; + voices = null; + channels = null; + + if (external_channels != null) + for (int i = 0; i < external_channels.length; i++) + external_channels[i].setChannel(null); + + if (sourceDataLine != null) { + sourceDataLine.close(); + sourceDataLine = null; + } + + inslist.clear(); + availlist.clear(); + loadedlist.clear(); + tunings.clear(); + + while (recvslist.size() != 0) + recvslist.get(recvslist.size() - 1).close(); + + } + } + + public boolean isOpen() { + synchronized (control_mutex) { + return open; + } + } + + public long getMicrosecondPosition() { + + if (!isOpen()) + return 0; + + synchronized (control_mutex) { + return mainmixer.getMicrosecondPosition(); + } + } + + public int getMaxReceivers() { + return -1; + } + + public int getMaxTransmitters() { + return 0; + } + + public Receiver getReceiver() throws MidiUnavailableException { + + synchronized (control_mutex) { + SoftReceiver receiver = new SoftReceiver(this); + receiver.open = open; + recvslist.add(receiver); + return receiver; + } + } + + public List getReceivers() { + + synchronized (control_mutex) { + ArrayList recvs = new ArrayList(); + recvs.addAll(recvslist); + return recvs; + } + } + + public Transmitter getTransmitter() throws MidiUnavailableException { + + throw new MidiUnavailableException("No transmitter available"); + } + + public List getTransmitters() { + + return new ArrayList(); + } + + public Receiver getReceiverReferenceCounting() + throws MidiUnavailableException { + + if (!isOpen()) { + open(); + synchronized (control_mutex) { + implicitOpen = true; + } + } + + return getReceiver(); + } + + public Transmitter getTransmitterReferenceCounting() + throws MidiUnavailableException { + + throw new MidiUnavailableException("No transmitter available"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftTuning.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftTuning.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,256 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.Patch; + +/** + * A tuning program container, for use with MIDI Tuning. + * See: http://www.midi.org + * + * @author Karl Helgason + */ +public class SoftTuning { + + private String name = null; + private double[] tuning = new double[128]; + private Patch patch = null; + + public SoftTuning() { + name = "12-TET"; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + } + + public SoftTuning(byte[] data) { + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + load(data); + } + + public SoftTuning(Patch patch) { + this.patch = patch; + name = "12-TET"; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + } + + public SoftTuning(Patch patch, byte[] data) { + this.patch = patch; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + load(data); + } + + private boolean checksumOK(byte[] data) { + int x = data[1] & 0xFF; + for (int i = 2; i < data.length - 2; i++) + x = x ^ (data[i] & 0xFF); + return (data[data.length - 2] & 0xFF) == (x & 127); + } + + /* + private boolean checksumOK2(byte[] data) { + int x = data[1] & 0xFF; // 7E + x = x ^ (data[2] & 0xFF); // + x = x ^ (data[4] & 0xFF); // nn + x = x ^ (data[5] & 0xFF); // tt + for (int i = 22; i < data.length - 2; i++) + x = x ^ (data[i] & 0xFF); + return (data[data.length - 2] & 0xFF) == (x & 127); + } + */ + public void load(byte[] data) { + // Universal Non-Real-Time / Real-Time SysEx + if ((data[1] & 0xFF) == 0x7E || (data[1] & 0xFF) == 0x7F) { + int subid1 = data[3] & 0xFF; + switch (subid1) { + case 0x08: // MIDI Tuning Standard + int subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // BULK TUNING DUMP (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning.shtml + //if (!checksumOK2(data)) + // break; + try { + name = new String(data, 6, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + int r = 22; + for (int i = 0; i < 128; i++) { + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[i] = 100.0 * + (((xx * 16384) + (yy * 128) + zz) / 16384.0); + } + break; + } + case 0x02: // SINGLE NOTE TUNING CHANGE (REAL-TIME) + { + // http://www.midi.org/about-midi/tuning.shtml + int ll = data[6] & 0xFF; + int r = 7; + for (int i = 0; i < ll; i++) { + int kk = data[r++] & 0xFF; + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[kk] = 100.0*(((xx*16384) + (yy*128) + zz)/16384.0); + } + break; + } + case 0x04: // KEY-BASED TUNING DUMP (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + if (!checksumOK(data)) + break; + try { + name = new String(data, 7, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + int r = 23; + for (int i = 0; i < 128; i++) { + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[i] = 100.0*(((xx*16384) + (yy*128) + zz)/16384.0); + } + break; + } + case 0x05: // SCALE/OCTAVE TUNING DUMP, 1 byte format + // (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + if (!checksumOK(data)) + break; + try { + name = new String(data, 7, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + int[] octave_tuning = new int[12]; + for (int i = 0; i < 12; i++) + octave_tuning[i] = (data[i + 23] & 0xFF) - 64; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + case 0x06: // SCALE/OCTAVE TUNING DUMP, 2 byte format + // (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + if (!checksumOK(data)) + break; + try { + name = new String(data, 7, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + double[] octave_tuning = new double[12]; + for (int i = 0; i < 12; i++) { + int v = (data[i * 2 + 23] & 0xFF) * 128 + + (data[i * 2 + 24] & 0xFF); + octave_tuning[i] = (v / 8192.0 - 1) * 100.0; + } + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + case 0x07: // SINGLE NOTE TUNING CHANGE (NON + // REAL-TIME/REAL-TIME) (BANK) + // http://www.midi.org/about-midi/tuning_extens.shtml + int ll = data[7] & 0xFF; + int r = 8; + for (int i = 0; i < ll; i++) { + int kk = data[r++] & 0xFF; + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[kk] = 100.0 + * (((xx*16384) + (yy*128) + zz) / 16384.0); + } + break; + case 0x08: // scale/octave tuning 1-byte form (Non + // Real-Time/REAL-TIME) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + int[] octave_tuning = new int[12]; + for (int i = 0; i < 12; i++) + octave_tuning[i] = (data[i + 8] & 0xFF) - 64; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + case 0x09: // scale/octave tuning 2-byte form (Non + // Real-Time/REAL-TIME) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + double[] octave_tuning = new double[12]; + for (int i = 0; i < 12; i++) { + int v = (data[i * 2 + 8] & 0xFF) * 128 + + (data[i * 2 + 9] & 0xFF); + octave_tuning[i] = (v / 8192.0 - 1) * 100.0; + } + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + default: + break; + } + } + } + } + + public double[] getTuning() { + return tuning; + } + + public double getTuning(int noteNumber) { + return tuning[noteNumber]; + } + + public Patch getPatch() { + return patch; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/SoftVoice.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,841 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.sound.midi.VoiceStatus; + +/** + * Software synthesizer voice class. + * + * @author Karl Helgason + */ +public class SoftVoice extends VoiceStatus { + + public int exclusiveClass = 0; + public boolean releaseTriggered = false; + private int noteOn_noteNumber = 0; + private int noteOn_velocity = 0; + private int noteOff_velocity = 0; + protected ModelChannelMixer channelmixer = null; + protected double tunedKey = 0; + protected SoftTuning tuning = null; + protected SoftChannel stealer_channel = null; + protected ModelConnectionBlock[] stealer_extendedConnectionBlocks = null; + protected SoftPerformer stealer_performer = null; + protected ModelChannelMixer stealer_channelmixer = null; + protected int stealer_voiceID = -1; + protected int stealer_noteNumber = 0; + protected int stealer_velocity = 0; + protected boolean stealer_releaseTriggered = false; + protected int voiceID = -1; + protected boolean sustain = false; + protected boolean sostenuto = false; + protected boolean portamento = false; + private SoftFilter filter_left; + private SoftFilter filter_right; + private SoftProcess eg = new SoftEnvelopeGenerator(); + private SoftProcess lfo = new SoftLowFrequencyOscillator(); + protected Map objects = + new HashMap(); + protected SoftSynthesizer synthesizer; + protected SoftInstrument instrument; + protected SoftPerformer performer; + protected SoftChannel softchannel = null; + protected boolean on = false; + private boolean audiostarted = false; + private boolean started = false; + private boolean stopping = false; + private float osc_attenuation = 0.0f; + private ModelOscillatorStream osc_stream; + private int osc_stream_nrofchannels; + private float[][] osc_buff = new float[2][]; + private boolean osc_stream_off_transmitted = false; + private boolean out_mixer_end = false; + private float out_mixer_left = 0; + private float out_mixer_right = 0; + private float out_mixer_effect1 = 0; + private float out_mixer_effect2 = 0; + private float last_out_mixer_left = 0; + private float last_out_mixer_right = 0; + private float last_out_mixer_effect1 = 0; + private float last_out_mixer_effect2 = 0; + protected ModelConnectionBlock[] extendedConnectionBlocks = null; + private ModelConnectionBlock[] connections; + // Last value added to destination + private double[] connections_last = new double[50]; + // Pointer to source value + private double[][][] connections_src = new double[50][3][]; + // Key-based override (if any) + private int[][] connections_src_kc = new int[50][3]; + // Pointer to destination value + private double[][] connections_dst = new double[50][]; + private boolean soundoff = false; + private float lastMuteValue = 0; + private float lastSoloMuteValue = 0; + protected double[] co_noteon_keynumber = new double[1]; + protected double[] co_noteon_velocity = new double[1]; + protected double[] co_noteon_on = new double[1]; + private SoftControl co_noteon = new SoftControl() { + double[] keynumber = co_noteon_keynumber; + double[] velocity = co_noteon_velocity; + double[] on = co_noteon_on; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("keynumber")) + return keynumber; + if (name.equals("velocity")) + return velocity; + if (name.equals("on")) + return on; + return null; + } + }; + private double[] co_mixer_active = new double[1]; + private double[] co_mixer_gain = new double[1]; + private double[] co_mixer_pan = new double[1]; + private double[] co_mixer_balance = new double[1]; + private double[] co_mixer_reverb = new double[1]; + private double[] co_mixer_chorus = new double[1]; + private SoftControl co_mixer = new SoftControl() { + double[] active = co_mixer_active; + double[] gain = co_mixer_gain; + double[] pan = co_mixer_pan; + double[] balance = co_mixer_balance; + double[] reverb = co_mixer_reverb; + double[] chorus = co_mixer_chorus; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("active")) + return active; + if (name.equals("gain")) + return gain; + if (name.equals("pan")) + return pan; + if (name.equals("balance")) + return balance; + if (name.equals("reverb")) + return reverb; + if (name.equals("chorus")) + return chorus; + return null; + } + }; + private double[] co_osc_pitch = new double[1]; + private SoftControl co_osc = new SoftControl() { + double[] pitch = co_osc_pitch; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("pitch")) + return pitch; + return null; + } + }; + private double[] co_filter_freq = new double[1]; + private double[] co_filter_type = new double[1]; + private double[] co_filter_q = new double[1]; + private SoftControl co_filter = new SoftControl() { + double[] freq = co_filter_freq; + double[] ftype = co_filter_type; + double[] q = co_filter_q; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("freq")) + return freq; + if (name.equals("type")) + return ftype; + if (name.equals("q")) + return q; + return null; + } + }; + protected SoftResamplerStreamer resampler; + private int nrofchannels; + + public SoftVoice(SoftSynthesizer synth) { + synthesizer = synth; + filter_left = new SoftFilter(synth.getFormat().getSampleRate()); + filter_right = new SoftFilter(synth.getFormat().getSampleRate()); + nrofchannels = synth.getFormat().getChannels(); + } + + private int getValueKC(ModelIdentifier id) { + if (id.getObject().equals("midi_cc")) { + int ic = Integer.parseInt(id.getVariable()); + if (ic != 0 && ic != 32) { + if (ic < 120) + return ic; + } + } else if (id.getObject().equals("midi_rpn")) { + if (id.getVariable().equals("1")) + return 120; // Fine tuning + if (id.getVariable().equals("2")) + return 121; // Coarse tuning + } + return -1; + } + + private double[] getValue(ModelIdentifier id) { + SoftControl o = objects.get(id.getObject()); + if (o == null) + return null; + return o.get(id.getInstance(), id.getVariable()); + } + + private double transformValue(double value, ModelSource src) { + if (src.getTransform() != null) + return src.getTransform().transform(value); + else + return value; + } + + private double transformValue(double value, ModelDestination dst) { + if (dst.getTransform() != null) + return dst.getTransform().transform(value); + else + return value; + } + + private double processKeyBasedController(double value, int keycontrol) { + if (keycontrol == -1) + return value; + if (softchannel.keybasedcontroller_active != null) + if (softchannel.keybasedcontroller_active[note] != null) + if (softchannel.keybasedcontroller_active[note][keycontrol]) { + double key_controlvalue = + softchannel.keybasedcontroller_value[note][keycontrol]; + if (keycontrol == 10 || keycontrol == 91 || keycontrol == 93) + return key_controlvalue; + value += key_controlvalue * 2.0 - 1.0; + if (value > 1) + value = 1; + else if (value < 0) + value = 0; + } + return value; + } + + private void processConnection(int ix) { + ModelConnectionBlock conn = connections[ix]; + double[][] src = connections_src[ix]; + double[] dst = connections_dst[ix]; + if (dst == null || Double.isInfinite(dst[0])) + return; + + double value = conn.getScale(); + if (softchannel.keybasedcontroller_active == null) { + ModelSource[] srcs = conn.getSources(); + for (int i = 0; i < srcs.length; i++) { + value *= transformValue(src[i][0], srcs[i]); + if (value == 0) + break; + } + } else { + ModelSource[] srcs = conn.getSources(); + int[] src_kc = connections_src_kc[ix]; + for (int i = 0; i < srcs.length; i++) { + value *= transformValue(processKeyBasedController(src[i][0], + src_kc[i]), srcs[i]); + if (value == 0) + break; + } + } + + value = transformValue(value, conn.getDestination()); + dst[0] = dst[0] - connections_last[ix] + value; + connections_last[ix] = value; + // co_mixer_gain[0] = 0; + } + + protected void updateTuning(SoftTuning newtuning) { + tunedKey = tuning.getTuning(note) / 100.0; + if (!portamento) { + co_noteon_keynumber[0] = tunedKey * (1.0 / 128.0); + int[] c = performer.midi_connections[4]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + } + + protected void setNote(int noteNumber) { + note = noteNumber; + tunedKey = tuning.getTuning(noteNumber) / 100.0; + } + + protected void noteOn(int noteNumber, int velocity) { + + sustain = false; + sostenuto = false; + portamento = false; + + soundoff = false; + on = true; + active = true; + started = true; + // volume = velocity; + + noteOn_noteNumber = noteNumber; + noteOn_velocity = velocity; + + lastMuteValue = 0; + lastSoloMuteValue = 0; + + setNote(noteNumber); + + if (performer.forcedKeynumber) + co_noteon_keynumber[0] = 0; + else + co_noteon_keynumber[0] = tunedKey * (1f / 128f); + if (performer.forcedVelocity) + co_noteon_velocity[0] = 0; + else + co_noteon_velocity[0] = velocity * (1f / 128f); + co_mixer_active[0] = 0; + co_mixer_gain[0] = 0; + co_mixer_pan[0] = 0; + co_mixer_balance[0] = 0; + co_mixer_reverb[0] = 0; + co_mixer_chorus[0] = 0; + co_osc_pitch[0] = 0; + co_filter_freq[0] = 0; + co_filter_q[0] = 0; + co_filter_type[0] = 0; + co_noteon_on[0] = 1; + + eg.reset(); + lfo.reset(); + filter_left.reset(); + filter_right.reset(); + + objects.put("master", synthesizer.getMainMixer().co_master); + objects.put("eg", eg); + objects.put("lfo", lfo); + objects.put("noteon", co_noteon); + objects.put("osc", co_osc); + objects.put("mixer", co_mixer); + objects.put("filter", co_filter); + + connections = performer.connections; + + if (connections_last == null + || connections_last.length < connections.length) { + connections_last = new double[connections.length]; + } + if (connections_src == null + || connections_src.length < connections.length) { + connections_src = new double[connections.length][][]; + connections_src_kc = new int[connections.length][]; + } + if (connections_dst == null + || connections_dst.length < connections.length) { + connections_dst = new double[connections.length][]; + } + for (int i = 0; i < connections.length; i++) { + ModelConnectionBlock conn = connections[i]; + connections_last[i] = 0; + if (conn.getSources() != null) { + ModelSource[] srcs = conn.getSources(); + if (connections_src[i] == null + || connections_src[i].length < srcs.length) { + connections_src[i] = new double[srcs.length][]; + connections_src_kc[i] = new int[srcs.length]; + } + double[][] src = connections_src[i]; + int[] src_kc = connections_src_kc[i]; + connections_src[i] = src; + for (int j = 0; j < srcs.length; j++) { + src_kc[j] = getValueKC(srcs[j].getIdentifier()); + src[j] = getValue(srcs[j].getIdentifier()); + } + } + + if (conn.getDestination() != null) + connections_dst[i] = getValue(conn.getDestination() + .getIdentifier()); + else + connections_dst[i] = null; + } + + for (int i = 0; i < connections.length; i++) + processConnection(i); + + if (extendedConnectionBlocks != null) { + for (ModelConnectionBlock connection: extendedConnectionBlocks) { + double value = 0; + + if (softchannel.keybasedcontroller_active == null) { + for (ModelSource src: connection.getSources()) { + double x = getValue(src.getIdentifier())[0]; + ModelTransform t = src.getTransform(); + if (t == null) + value += x; + else + value += t.transform(x); + } + } else { + for (ModelSource src: connection.getSources()) { + double x = getValue(src.getIdentifier())[0]; + x = processKeyBasedController(x, + getValueKC(src.getIdentifier())); + ModelTransform t = src.getTransform(); + if (t == null) + value += x; + else + value += t.transform(x); + } + } + + ModelDestination dest = connection.getDestination(); + ModelTransform t = dest.getTransform(); + if (t != null) + value = t.transform(value); + getValue(dest.getIdentifier())[0] += value; + } + } + + eg.init(synthesizer); + lfo.init(synthesizer); + + } + + protected void setPolyPressure(int pressure) { + int[] c = performer.midi_connections[2]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void setChannelPressure(int pressure) { + int[] c = performer.midi_connections[1]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void controlChange(int controller, int value) { + int[] c = performer.midi_ctrl_connections[controller]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void nrpnChange(int controller, int value) { + int[] c = performer.midi_nrpn_connections.get(controller); + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void rpnChange(int controller, int value) { + int[] c = performer.midi_rpn_connections.get(controller); + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void setPitchBend(int bend) { + int[] c = performer.midi_connections[0]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void setMute(boolean mute) { + co_mixer_gain[0] -= lastMuteValue; + lastMuteValue = mute ? -960 : 0; + co_mixer_gain[0] += lastMuteValue; + } + + protected void setSoloMute(boolean mute) { + co_mixer_gain[0] -= lastSoloMuteValue; + lastSoloMuteValue = mute ? -960 : 0; + co_mixer_gain[0] += lastSoloMuteValue; + } + + protected void shutdown() { + if (co_noteon_on[0] < -0.5) + return; + on = false; + + co_noteon_on[0] = -1; + + int[] c = performer.midi_connections[3]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void soundOff() { + on = false; + soundoff = true; + } + + protected void noteOff(int velocity) { + if (!on) + return; + on = false; + + noteOff_velocity = velocity; + + if (softchannel.sustain) { + sustain = true; + return; + } + if (sostenuto) + return; + + co_noteon_on[0] = 0; + + int[] c = performer.midi_connections[3]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void redamp() { + if (co_noteon_on[0] > 0.5) + return; + if (co_noteon_on[0] < -0.5) + return; // don't redamp notes in shutdown stage + + sustain = true; + co_noteon_on[0] = 1; + + int[] c = performer.midi_connections[3]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void processControlLogic() { + if (stopping) { + active = false; + stopping = false; + audiostarted = false; + if (osc_stream != null) + try { + osc_stream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + + if (stealer_channel != null) { + stealer_channel.initVoice(this, stealer_performer, + stealer_voiceID, stealer_noteNumber, stealer_velocity, + stealer_extendedConnectionBlocks, stealer_channelmixer, + stealer_releaseTriggered); + stealer_releaseTriggered = false; + stealer_channel = null; + stealer_performer = null; + stealer_voiceID = -1; + stealer_noteNumber = 0; + stealer_velocity = 0; + stealer_extendedConnectionBlocks = null; + stealer_channelmixer = null; + } + } + if (started) { + audiostarted = true; + + ModelOscillator osc = performer.oscillators[0]; + + osc_stream_off_transmitted = false; + if (osc instanceof ModelWavetable) { + try { + resampler.open((ModelWavetable)osc, + synthesizer.getFormat().getSampleRate()); + osc_stream = resampler; + } catch (IOException e) { + //e.printStackTrace(); + } + } else { + osc_stream = osc.open(synthesizer.getFormat().getSampleRate()); + } + osc_attenuation = osc.getAttenuation(); + osc_stream_nrofchannels = osc.getChannels(); + if (osc_buff == null || osc_buff.length < osc_stream_nrofchannels) + osc_buff = new float[osc_stream_nrofchannels][]; + + if (osc_stream != null) + osc_stream.noteOn(softchannel, this, noteOn_noteNumber, + noteOn_velocity); + + + } + if (audiostarted) { + if (portamento) { + double note_delta = tunedKey - (co_noteon_keynumber[0] * 128); + double note_delta_a = Math.abs(note_delta); + if (note_delta_a < 0.0000000001) { + co_noteon_keynumber[0] = tunedKey * (1.0 / 128.0); + portamento = false; + } else { + if (note_delta_a > softchannel.portamento_time) + note_delta = Math.signum(note_delta) + * softchannel.portamento_time; + co_noteon_keynumber[0] += note_delta * (1.0 / 128.0); + } + + int[] c = performer.midi_connections[4]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + eg.processControlLogic(); + lfo.processControlLogic(); + + for (int i = 0; i < performer.ctrl_connections.length; i++) + processConnection(performer.ctrl_connections[i]); + + osc_stream.setPitch((float)co_osc_pitch[0]); + + int filter_type = (int)co_filter_type[0]; + double filter_freq; + + if (co_filter_freq[0] == 13500.0) + filter_freq = 19912.126958213175; + else + filter_freq = 440.0 * Math.exp( + ((co_filter_freq[0]) - 6900.0) * + (Math.log(2.0) / 1200.0)); + /* + filter_freq = 440.0 * Math.pow(2.0, + ((co_filter_freq[0]) - 6900.0) / 1200.0);*/ + /* + * double velocity = co_noteon_velocity[0]; if(velocity < 0.5) + * filter_freq *= ((velocity * 2)*0.75 + 0.25); + */ + + double q = co_filter_q[0] / 10.0; + filter_left.setFilterType(filter_type); + filter_left.setFrequency(filter_freq); + filter_left.setResonance(q); + filter_right.setFilterType(filter_type); + filter_right.setFrequency(filter_freq); + filter_right.setResonance(q); + /* + float gain = (float) Math.pow(10, + (-osc_attenuation + co_mixer_gain[0]) / 200.0); + */ + float gain = (float)Math.exp( + (-osc_attenuation + co_mixer_gain[0])*(Math.log(10) / 200.0)); + + if (co_mixer_gain[0] <= -960) + gain = 0; + + if (soundoff) { + stopping = true; + gain = 0; + /* + * if(co_mixer_gain[0] > -960) + * co_mixer_gain[0] -= 960; + */ + } + + volume = (int)(Math.sqrt(gain) * 128); + + // gain *= 0.2; + + double pan = co_mixer_pan[0] * (1.0 / 1000.0); + // System.out.println("pan = " + pan); + if (pan < 0) + pan = 0; + else if (pan > 1) + pan = 1; + + if (pan == 0.5) { + out_mixer_left = gain * 0.7071067811865476f; + out_mixer_right = out_mixer_left; + } else { + out_mixer_left = gain * (float)Math.cos(pan * Math.PI * 0.5); + out_mixer_right = gain * (float)Math.sin(pan * Math.PI * 0.5); + } + + double balance = co_mixer_balance[0] * (1.0 / 1000.0); + if (balance != 0.5) { + if (balance > 0.5) + out_mixer_left *= (1 - balance) * 2; + else + out_mixer_right *= balance * 2; + } + + if (synthesizer.reverb_on) { + out_mixer_effect1 = (float)(co_mixer_reverb[0] * (1.0 / 1000.0)); + out_mixer_effect1 *= gain; + } else + out_mixer_effect1 = 0; + if (synthesizer.chorus_on) { + out_mixer_effect2 = (float)(co_mixer_chorus[0] * (1.0 / 1000.0)); + out_mixer_effect2 *= gain; + } else + out_mixer_effect2 = 0; + out_mixer_end = co_mixer_active[0] < 0.5; + + if (!on) + if (!osc_stream_off_transmitted) { + osc_stream_off_transmitted = true; + if (osc_stream != null) + osc_stream.noteOff(noteOff_velocity); + } + + } + if (started) { + last_out_mixer_left = out_mixer_left; + last_out_mixer_right = out_mixer_right; + last_out_mixer_effect1 = out_mixer_effect1; + last_out_mixer_effect2 = out_mixer_effect2; + started = false; + } + + } + + protected void mixAudioStream(SoftAudioBuffer in, SoftAudioBuffer out, + float amp_from, float amp_to) { + int bufferlen = in.getSize(); + if (amp_from < 0.000000001 && amp_to < 0.000000001) + return; + if (amp_from == amp_to) { + float[] fout = out.array(); + float[] fin = in.array(); + for (int i = 0; i < bufferlen; i++) + fout[i] += fin[i] * amp_to; + } else { + float amp = amp_from; + float amp_delta = (amp_to - amp_from) / bufferlen; + float[] fout = out.array(); + float[] fin = in.array(); + for (int i = 0; i < bufferlen; i++) { + amp += amp_delta; + fout[i] += fin[i] * amp; + } + } + + } + + protected void processAudioLogic(SoftAudioBuffer[] buffer) { + if (!audiostarted) + return; + + int bufferlen = buffer[0].getSize(); + + try { + osc_buff[0] = buffer[SoftMainMixer.CHANNEL_LEFT_DRY].array(); + if (nrofchannels != 1) + osc_buff[1] = buffer[SoftMainMixer.CHANNEL_RIGHT_DRY].array(); + int ret = osc_stream.read(osc_buff, 0, bufferlen); + if (ret == -1) { + stopping = true; + return; + } + if (ret != bufferlen) { + Arrays.fill(osc_buff[0], ret, bufferlen, 0f); + if (nrofchannels != 1) + Arrays.fill(osc_buff[1], ret, bufferlen, 0f); + } + + } catch (IOException e) { + //e.printStackTrace(); + } + + SoftAudioBuffer left = buffer[SoftMainMixer.CHANNEL_LEFT]; + SoftAudioBuffer right = buffer[SoftMainMixer.CHANNEL_RIGHT]; + SoftAudioBuffer eff1 = buffer[SoftMainMixer.CHANNEL_EFFECT1]; + SoftAudioBuffer eff2 = buffer[SoftMainMixer.CHANNEL_EFFECT2]; + SoftAudioBuffer leftdry = buffer[SoftMainMixer.CHANNEL_LEFT_DRY]; + SoftAudioBuffer rightdry = buffer[SoftMainMixer.CHANNEL_RIGHT_DRY]; + + if (osc_stream_nrofchannels == 1) + rightdry = null; + + if (!Double.isInfinite(co_filter_freq[0])) { + filter_left.processAudio(leftdry); + if (rightdry != null) + filter_right.processAudio(rightdry); + } + + if (nrofchannels == 1) { + out_mixer_left = (out_mixer_left + out_mixer_right) / 2; + mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left); + if (rightdry != null) + mixAudioStream(rightdry, left, last_out_mixer_left, + out_mixer_left); + } else { + mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left); + if (rightdry != null) + mixAudioStream(rightdry, right, last_out_mixer_right, + out_mixer_right); + else + mixAudioStream(leftdry, right, last_out_mixer_right, + out_mixer_right); + } + + if (rightdry == null) { + mixAudioStream(leftdry, eff1, last_out_mixer_effect1, + out_mixer_effect1); + mixAudioStream(leftdry, eff2, last_out_mixer_effect2, + out_mixer_effect2); + } else { + mixAudioStream(leftdry, eff1, last_out_mixer_effect1 * 0.5f, + out_mixer_effect1 * 0.5f); + mixAudioStream(leftdry, eff2, last_out_mixer_effect2 * 0.5f, + out_mixer_effect2 * 0.5f); + mixAudioStream(rightdry, eff1, last_out_mixer_effect1 * 0.5f, + out_mixer_effect1 * 0.5f); + mixAudioStream(rightdry, eff2, last_out_mixer_effect2 * 0.5f, + out_mixer_effect2 * 0.5f); + } + + last_out_mixer_left = out_mixer_left; + last_out_mixer_right = out_mixer_right; + last_out_mixer_effect1 = out_mixer_effect1; + last_out_mixer_effect2 = out_mixer_effect2; + + if (out_mixer_end) { + stopping = true; + } + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,339 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.spi.AudioFileReader; + +/** + * WAVE file reader for files using format WAVE_FORMAT_EXTENSIBLE (0xFFFE). + * + * @author Karl Helgason + */ +public class WaveExtensibleFileReader extends AudioFileReader { + + static private class GUID { + long i1; + + int s1; + + int s2; + + int x1; + + int x2; + + int x3; + + int x4; + + int x5; + + int x6; + + int x7; + + int x8; + + private GUID() { + } + + public GUID(long i1, int s1, int s2, int x1, int x2, int x3, int x4, + int x5, int x6, int x7, int x8) { + this.i1 = i1; + this.s1 = s1; + this.s2 = s2; + this.x1 = x1; + this.x2 = x2; + this.x3 = x3; + this.x4 = x4; + this.x5 = x5; + this.x6 = x6; + this.x7 = x7; + this.x8 = x8; + } + + public static GUID read(RIFFReader riff) throws IOException { + GUID d = new GUID(); + d.i1 = riff.readUnsignedInt(); + d.s1 = riff.readUnsignedShort(); + d.s2 = riff.readUnsignedShort(); + d.x1 = riff.readUnsignedByte(); + d.x2 = riff.readUnsignedByte(); + d.x3 = riff.readUnsignedByte(); + d.x4 = riff.readUnsignedByte(); + d.x5 = riff.readUnsignedByte(); + d.x6 = riff.readUnsignedByte(); + d.x7 = riff.readUnsignedByte(); + d.x8 = riff.readUnsignedByte(); + return d; + } + + public int hashCode() { + return (int) i1; + } + + public boolean equals(Object obj) { + if (!(obj instanceof GUID)) + return false; + GUID t = (GUID) obj; + if (i1 != t.i1) + return false; + if (s1 != t.s1) + return false; + if (s2 != t.s2) + return false; + if (x1 != t.x1) + return false; + if (x2 != t.x2) + return false; + if (x3 != t.x3) + return false; + if (x4 != t.x4) + return false; + if (x5 != t.x5) + return false; + if (x6 != t.x6) + return false; + if (x7 != t.x7) + return false; + if (x8 != t.x8) + return false; + return true; + } + + } + + private static String[] channelnames = { "FL", "FR", "FC", "LF", + "BL", + "BR", // 5.1 + "FLC", "FLR", "BC", "SL", "SR", "TC", "TFL", "TFC", "TFR", "TBL", + "TBC", "TBR" }; + + private static String[] allchannelnames = { "w1", "w2", "w3", "w4", "w5", + "w6", "w7", "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15", + "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23", "w24", + "w25", "w26", "w27", "w28", "w29", "w30", "w31", "w32", "w33", + "w34", "w35", "w36", "w37", "w38", "w39", "w40", "w41", "w42", + "w43", "w44", "w45", "w46", "w47", "w48", "w49", "w50", "w51", + "w52", "w53", "w54", "w55", "w56", "w57", "w58", "w59", "w60", + "w61", "w62", "w63", "w64" }; + + private static GUID SUBTYPE_PCM = new GUID(0x00000001, 0x0000, 0x0010, + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); + + private static GUID SUBTYPE_IEEE_FLOAT = new GUID(0x00000003, 0x0000, + 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); + + private String decodeChannelMask(long channelmask) { + StringBuffer sb = new StringBuffer(); + long m = 1; + for (int i = 0; i < allchannelnames.length; i++) { + if ((channelmask & m) != 0L) { + if (i < channelnames.length) { + sb.append(channelnames[i] + " "); + } else { + sb.append(allchannelnames[i] + " "); + } + } + m *= 2L; + } + if (sb.length() == 0) + return null; + return sb.substring(0, sb.length() - 1); + + } + + public AudioFileFormat getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + stream.mark(200); + AudioFileFormat format; + try { + format = internal_getAudioFileFormat(stream); + } finally { + stream.reset(); + } + return format; + } + + private AudioFileFormat internal_getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + + boolean fmt_found = false; + boolean data_found = false; + + int channels = 1; + long samplerate = 1; + // long framerate = 1; + int framesize = 1; + int bits = 1; + int validBitsPerSample = 1; + long channelMask = 0; + GUID subFormat = null; + + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + + if (chunk.getFormat().equals("fmt ")) { + fmt_found = true; + + int format = chunk.readUnsignedShort(); + if (format != 0xFFFE) + throw new UnsupportedAudioFileException(); // WAVE_FORMAT_EXTENSIBLE + // only + channels = chunk.readUnsignedShort(); + samplerate = chunk.readUnsignedInt(); + /* framerate = */chunk.readUnsignedInt(); + framesize = chunk.readUnsignedShort(); + bits = chunk.readUnsignedShort(); + int cbSize = chunk.readUnsignedShort(); + if (cbSize != 22) + throw new UnsupportedAudioFileException(); + validBitsPerSample = chunk.readUnsignedShort(); + if (validBitsPerSample > bits) + throw new UnsupportedAudioFileException(); + channelMask = chunk.readUnsignedInt(); + subFormat = GUID.read(chunk); + + } + if (chunk.getFormat().equals("data")) { + data_found = true; + break; + } + } + + if (!fmt_found) + throw new UnsupportedAudioFileException(); + if (!data_found) + throw new UnsupportedAudioFileException(); + + Map p = new HashMap(); + String s_channelmask = decodeChannelMask(channelMask); + if (s_channelmask != null) + p.put("channelOrder", s_channelmask); + if (channelMask != 0) + p.put("channelMask", channelMask); + // validBitsPerSample is only informational for PCM data, + // data is still encode according to SampleSizeInBits. + p.put("validBitsPerSample", validBitsPerSample); + + AudioFormat audioformat = null; + if (subFormat.equals(SUBTYPE_PCM)) { + if (bits == 8) { + audioformat = new AudioFormat(Encoding.PCM_UNSIGNED, + samplerate, bits, channels, framesize, samplerate, + false, p); + } else { + audioformat = new AudioFormat(Encoding.PCM_SIGNED, samplerate, + bits, channels, framesize, samplerate, false, p); + } + } else if (subFormat.equals(SUBTYPE_IEEE_FLOAT)) { + audioformat = new AudioFormat(AudioFloatConverter.PCM_FLOAT, + samplerate, bits, channels, framesize, samplerate, false, p); + } else + throw new UnsupportedAudioFileException(); + + AudioFileFormat fileformat = new AudioFileFormat( + AudioFileFormat.Type.WAVE, audioformat, + AudioSystem.NOT_SPECIFIED); + return fileformat; + } + + public AudioInputStream getAudioInputStream(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + AudioFileFormat format = getAudioFileFormat(stream); + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + if (chunk.getFormat().equals("data")) { + return new AudioInputStream(chunk, format.getFormat(), chunk + .getSize()); + } + } + throw new UnsupportedAudioFileException(); + } + + public AudioFileFormat getAudioFileFormat(URL url) + throws UnsupportedAudioFileException, IOException { + InputStream stream = url.openStream(); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioFileFormat getAudioFileFormat(File file) + throws UnsupportedAudioFileException, IOException { + InputStream stream = new FileInputStream(file); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioInputStream getAudioInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(url.openStream())); + } + + public AudioInputStream getAudioInputStream(File file) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(new FileInputStream( + file))); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/WaveFloatFileReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,166 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; +import javax.sound.sampled.spi.AudioFileReader; + +/** + * Floating-point encoded (format 3) WAVE file loader. + * + * @author Karl Helgason + */ +public class WaveFloatFileReader extends AudioFileReader { + + public AudioFileFormat getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + stream.mark(200); + AudioFileFormat format; + try { + format = internal_getAudioFileFormat(stream); + } finally { + stream.reset(); + } + return format; + } + + private AudioFileFormat internal_getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + + boolean fmt_found = false; + boolean data_found = false; + + int channels = 1; + long samplerate = 1; + int framesize = 1; + int bits = 1; + + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + + if (chunk.getFormat().equals("fmt ")) { + fmt_found = true; + + int format = chunk.readUnsignedShort(); + if (format != 3) // WAVE_FORMAT_IEEE_FLOAT only + throw new UnsupportedAudioFileException(); + channels = chunk.readUnsignedShort(); + samplerate = chunk.readUnsignedInt(); + /* framerate = */chunk.readUnsignedInt(); + framesize = chunk.readUnsignedShort(); + bits = chunk.readUnsignedShort(); + } + if (chunk.getFormat().equals("data")) { + data_found = true; + break; + } + } + + if (!fmt_found) + throw new UnsupportedAudioFileException(); + if (!data_found) + throw new UnsupportedAudioFileException(); + + AudioFormat audioformat = new AudioFormat( + AudioFloatConverter.PCM_FLOAT, samplerate, bits, channels, + framesize, samplerate, false); + AudioFileFormat fileformat = new AudioFileFormat( + AudioFileFormat.Type.WAVE, audioformat, + AudioSystem.NOT_SPECIFIED); + return fileformat; + } + + public AudioInputStream getAudioInputStream(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + AudioFileFormat format = getAudioFileFormat(stream); + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + if (chunk.getFormat().equals("data")) { + return new AudioInputStream(chunk, format.getFormat(), + chunk.getSize()); + } + } + throw new UnsupportedAudioFileException(); + } + + public AudioFileFormat getAudioFileFormat(URL url) + throws UnsupportedAudioFileException, IOException { + InputStream stream = url.openStream(); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioFileFormat getAudioFileFormat(File file) + throws UnsupportedAudioFileException, IOException { + InputStream stream = new FileInputStream(file); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioInputStream getAudioInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(url.openStream())); + } + + public AudioInputStream getAudioInputStream(File file) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(new FileInputStream( + file))); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/WaveFloatFileWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileWriter.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,147 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFileFormat.Type; +import javax.sound.sampled.spi.AudioFileWriter; + +/** + * Floating-point encoded (format 3) WAVE file writer. + * + * @author Karl Helgason + */ +public class WaveFloatFileWriter extends AudioFileWriter { + + public Type[] getAudioFileTypes() { + return new Type[] { Type.WAVE }; + } + + public Type[] getAudioFileTypes(AudioInputStream stream) { + + if (!stream.getFormat().getEncoding().equals( + AudioFloatConverter.PCM_FLOAT)) + return new Type[0]; + return new Type[] { Type.WAVE }; + } + + private void checkFormat(AudioFileFormat.Type type, AudioInputStream stream) { + if (!Type.WAVE.equals(type)) + throw new IllegalArgumentException("File type " + type + + " not supported."); + if (!stream.getFormat().getEncoding().equals( + AudioFloatConverter.PCM_FLOAT)) + throw new IllegalArgumentException("File format " + + stream.getFormat() + " not supported."); + } + + public void write(AudioInputStream stream, RIFFWriter writer) + throws IOException { + + RIFFWriter fmt_chunk = writer.writeChunk("fmt "); + + AudioFormat format = stream.getFormat(); + fmt_chunk.writeUnsignedShort(3); // WAVE_FORMAT_IEEE_FLOAT + fmt_chunk.writeUnsignedShort(format.getChannels()); + fmt_chunk.writeUnsignedInt((int) format.getSampleRate()); + fmt_chunk.writeUnsignedInt(((int) format.getFrameRate()) + * format.getFrameSize()); + fmt_chunk.writeUnsignedShort(format.getFrameSize()); + fmt_chunk.writeUnsignedShort(format.getSampleSizeInBits()); + fmt_chunk.close(); + RIFFWriter data_chunk = writer.writeChunk("data"); + byte[] buff = new byte[1024]; + int len; + while ((len = stream.read(buff, 0, buff.length)) != -1) + data_chunk.write(buff, 0, len); + data_chunk.close(); + } + + private static class NoCloseOutputStream extends OutputStream { + OutputStream out; + + public NoCloseOutputStream(OutputStream out) { + this.out = out; + } + + public void write(int b) throws IOException { + out.write(b); + } + + public void flush() throws IOException { + out.flush(); + } + + public void write(byte[] b, int off, int len) throws IOException { + out.write(b, off, len); + } + + public void write(byte[] b) throws IOException { + out.write(b); + } + } + + private AudioInputStream toLittleEndian(AudioInputStream ais) { + AudioFormat format = ais.getFormat(); + AudioFormat targetFormat = new AudioFormat(format.getEncoding(), format + .getSampleRate(), format.getSampleSizeInBits(), format + .getChannels(), format.getFrameSize(), format.getFrameRate(), + false); + return AudioSystem.getAudioInputStream(targetFormat, ais); + } + + public int write(AudioInputStream stream, Type fileType, OutputStream out) + throws IOException { + + checkFormat(fileType, stream); + if (stream.getFormat().isBigEndian()) + stream = toLittleEndian(stream); + RIFFWriter writer = new RIFFWriter(new NoCloseOutputStream(out), "WAVE"); + write(stream, writer); + int fpointer = (int) writer.getFilePointer(); + writer.close(); + return fpointer; + } + + public int write(AudioInputStream stream, Type fileType, File out) + throws IOException { + checkFormat(fileType, stream); + if (stream.getFormat().isBigEndian()) + stream = toLittleEndian(stream); + RIFFWriter writer = new RIFFWriter(out, "WAVE"); + write(stream, writer); + int fpointer = (int) writer.getFilePointer(); + writer.close(); + return fpointer; + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ # Providers for midi devices -com.sun.media.sound.MixerSynthProvider com.sun.media.sound.RealTimeSequencerProvider com.sun.media.sound.MidiOutDeviceProvider com.sun.media.sound.MidiInDeviceProvider +com.sun.media.sound.SoftProvider diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader Thu Feb 05 09:24:45 2009 -0800 @@ -1,3 +1,2 @@ # Providers for midi sequences com.sun.media.sound.StandardMidiFileReader -com.sun.media.sound.RmfFileReader diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader Thu Feb 05 09:24:45 2009 -0800 @@ -1,2 +1,5 @@ # Providers for Soundbanks -com.sun.media.sound.HsbParser +com.sun.media.sound.SF2SoundbankReader +com.sun.media.sound.DLSSoundbankReader +com.sun.media.sound.AudioFileSoundbankReader +com.sun.media.sound.JARSoundbankReader diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader Thu Feb 05 09:24:45 2009 -0800 @@ -2,3 +2,5 @@ com.sun.media.sound.AuFileReader com.sun.media.sound.AiffFileReader com.sun.media.sound.WaveFileReader +com.sun.media.sound.WaveFloatFileReader +com.sun.media.sound.SoftMidiAudioFileReader diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider Thu Feb 05 09:24:45 2009 -0800 @@ -2,3 +2,4 @@ com.sun.media.sound.UlawCodec com.sun.media.sound.AlawCodec com.sun.media.sound.PCMtoPCMCodec +com.sun.media.sound.AudioFloatFormatConverter diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,3 @@ # last mixer is default mixer com.sun.media.sound.PortMixerProvider -com.sun.media.sound.SimpleInputDeviceProvider -com.sun.media.sound.HeadspaceMixerProvider com.sun.media.sound.DirectAudioDeviceProvider diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/beans/EventHandler.java --- a/jdk/src/share/classes/java/beans/EventHandler.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/beans/EventHandler.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -385,16 +385,16 @@ try { Method getter = null; if (target != null) { - getter = ReflectionUtils.getMethod(target.getClass(), + getter = Statement.getMethod(target.getClass(), "get" + NameGenerator.capitalize(first), new Class[]{}); if (getter == null) { - getter = ReflectionUtils.getMethod(target.getClass(), + getter = Statement.getMethod(target.getClass(), "is" + NameGenerator.capitalize(first), new Class[]{}); } if (getter == null) { - getter = ReflectionUtils.getMethod(target.getClass(), first, new Class[]{}); + getter = Statement.getMethod(target.getClass(), first, new Class[]{}); } } if (getter == null) { @@ -462,10 +462,10 @@ target = applyGetters(target, action.substring(0, lastDot)); action = action.substring(lastDot + 1); } - Method targetMethod = ReflectionUtils.getMethod( + Method targetMethod = Statement.getMethod( target.getClass(), action, argTypes); if (targetMethod == null) { - targetMethod = ReflectionUtils.getMethod(target.getClass(), + targetMethod = Statement.getMethod(target.getClass(), "set" + NameGenerator.capitalize(action), argTypes); } if (targetMethod == null) { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/beans/MetaData.java --- a/jdk/src/share/classes/java/beans/MetaData.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/beans/MetaData.java Thu Feb 05 09:24:45 2009 -0800 @@ -24,6 +24,8 @@ */ package java.beans; +import com.sun.beans.finder.PrimitiveWrapperMap; + import java.awt.AWTKeyStroke; import java.awt.BorderLayout; import java.awt.Dimension; @@ -204,7 +206,7 @@ if (c.isPrimitive()) { Field field = null; try { - field = ReflectionUtils.typeToClass(c).getDeclaredField("TYPE"); + field = PrimitiveWrapperMap.getType(c.getName()).getDeclaredField("TYPE"); } catch (NoSuchFieldException ex) { System.err.println("Unknown primitive type: " + c); } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/beans/ReflectionUtils.java --- a/jdk/src/share/classes/java/beans/ReflectionUtils.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/beans/ReflectionUtils.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,20 +24,7 @@ */ package java.beans; -import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; - -import java.lang.ref.Reference; -import java.lang.ref.SoftReference; - -import java.util.*; - -import com.sun.beans.ObjectHandler; -import sun.reflect.misc.MethodUtil; -import sun.reflect.misc.ConstructorUtil; -import sun.reflect.misc.ReflectUtil; /** * A utility class for reflectively finding methods, constuctors and fields @@ -45,12 +32,6 @@ */ class ReflectionUtils { - private static Reference methodCacheRef; - - public static Class typeToClass(Class type) { - return type.isPrimitive() ? ObjectHandler.typeNameToClass(type.getName()) : type; - } - public static boolean isPrimitive(Class type) { return primitiveTypeFor(type) != null; } @@ -69,346 +50,6 @@ } /** - * Tests each element on the class arrays for assignability. - * - * @param argClasses arguments to be tested - * @param argTypes arguments from Method - * @return true if each class in argTypes is assignable from the - * corresponding class in argClasses. - */ - private static boolean matchArguments(Class[] argClasses, Class[] argTypes) { - return matchArguments(argClasses, argTypes, false); - } - - /** - * Tests each element on the class arrays for equality. - * - * @param argClasses arguments to be tested - * @param argTypes arguments from Method - * @return true if each class in argTypes is equal to the - * corresponding class in argClasses. - */ - private static boolean matchExplicitArguments(Class[] argClasses, Class[] argTypes) { - return matchArguments(argClasses, argTypes, true); - } - - private static boolean matchArguments(Class[] argClasses, - Class[] argTypes, boolean explicit) { - - boolean match = (argClasses.length == argTypes.length); - for(int j = 0; j < argClasses.length && match; j++) { - Class argType = argTypes[j]; - if (argType.isPrimitive()) { - argType = typeToClass(argType); - } - if (explicit) { - // Test each element for equality - if (argClasses[j] != argType) { - match = false; - } - } else { - // Consider null an instance of all classes. - if (argClasses[j] != null && - !(argType.isAssignableFrom(argClasses[j]))) { - match = false; - } - } - } - return match; - } - - /** - * @return the method which best matches the signature or throw an exception - * if it can't be found or the method is ambiguous. - */ - static Method getPublicMethod(Class declaringClass, String methodName, - Class[] argClasses) throws NoSuchMethodException { - Method m; - - m = findPublicMethod(declaringClass, methodName, argClasses); - if (m == null) - throw new NoSuchMethodException(declaringClass.getName() + "." + methodName); - return m; - } - - /** - * @return the method which best matches the signature or null if it cant be found or - * the method is ambiguous. - */ - public static Method findPublicMethod(Class declaringClass, String methodName, - Class[] argClasses) { - // Many methods are "getters" which take no arguments. - // This permits the following optimisation which - // avoids the expensive call to getMethods(). - if (argClasses.length == 0) { - try { - return MethodUtil.getMethod(declaringClass, methodName, argClasses); - } - catch (NoSuchMethodException e) { - return null; - } catch (SecurityException se) { - // fall through - } - } - Method[] methods = MethodUtil.getPublicMethods(declaringClass); - List list = new ArrayList(); - for(int i = 0; i < methods.length; i++) { - // Collect all the methods which match the signature. - Method method = methods[i]; - if (method.getName().equals(methodName)) { - if (matchArguments(argClasses, method.getParameterTypes())) { - list.add(method); - } - } - } - if (list.size() > 0) { - if (list.size() == 1) { - return (Method)list.get(0); - } - else { - ListIterator iterator = list.listIterator(); - Method method; - while (iterator.hasNext()) { - method = (Method)iterator.next(); - if (matchExplicitArguments(argClasses, method.getParameterTypes())) { - return method; - } - } - // There are more than one method which matches this signature. - // try to return the most specific method. - return getMostSpecificMethod(list, argClasses); - } - } - return null; - } - - /** - * Return the most specific method from the list of methods which - * matches the args. The most specific method will have the most - * number of equal parameters or will be closest in the inheritance - * heirarchy to the runtime execution arguments. - *

    - * See the JLS section 15.12 - * http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#20448 - * - * @param methods List of methods which already have the same param length - * and arg types are assignable to param types - * @param args an array of param types to match - * @return method or null if a specific method cannot be determined - */ - private static Method getMostSpecificMethod(List methods, Class[] args) { - Method method = null; - - int matches = 0; - int lastMatch = matches; - - ListIterator iterator = methods.listIterator(); - while (iterator.hasNext()) { - Method m = (Method)iterator.next(); - Class[] mArgs = m.getParameterTypes(); - matches = 0; - for (int i = 0; i < args.length; i++) { - Class mArg = mArgs[i]; - if (mArg.isPrimitive()) { - mArg = typeToClass(mArg); - } - if (args[i] == mArg) { - matches++; - } - } - if (matches == 0 && lastMatch == 0) { - if (method == null) { - method = m; - } else { - // Test existing method. We already know that the args can - // be assigned to all the method params. However, if the - // current method parameters is higher in the inheritance - // hierarchy then replace it. - if (!matchArguments(method.getParameterTypes(), - m.getParameterTypes())) { - method = m; - } - } - } else if (matches > lastMatch) { - lastMatch = matches; - method = m; - } else if (matches == lastMatch) { - // ambiguous method selection. - method = null; - } - } - return method; - } - - /** - * @return the method or null if it can't be found or is ambiguous. - */ - public static Method findMethod(Class targetClass, String methodName, - Class[] argClasses) { - Method m = findPublicMethod(targetClass, methodName, argClasses); - if (m != null && Modifier.isPublic(m.getDeclaringClass().getModifiers())) { - return m; - } - - /* - Search the interfaces for a public version of this method. - - Example: the getKeymap() method of a JTextField - returns a package private implementation of the - of the public Keymap interface. In the Keymap - interface there are a number of "properties" one - being the "resolveParent" property implied by the - getResolveParent() method. This getResolveParent() - cannot be called reflectively because the class - itself is not public. Instead we search the class's - interfaces and find the getResolveParent() - method of the Keymap interface - on which invoke - may be applied without error. - - So in :- - - JTextField o = new JTextField("Hello, world"); - Keymap km = o.getKeymap(); - Method m1 = km.getClass().getMethod("getResolveParent", new Class[0]); - Method m2 = Keymap.class.getMethod("getResolveParent", new Class[0]); - - Methods m1 and m2 are different. The invocation of method - m1 unconditionally throws an IllegalAccessException where - the invocation of m2 will invoke the implementation of the - method. Note that (ignoring the overloading of arguments) - there is only one implementation of the named method which - may be applied to this target. - */ - for(Class type = targetClass; type != null; type = type.getSuperclass()) { - Class[] interfaces = type.getInterfaces(); - for(int i = 0; i < interfaces.length; i++) { - m = findPublicMethod(interfaces[i], methodName, argClasses); - if (m != null) { - return m; - } - } - } - return null; - } - - /** - * A class that represents the unique elements of a method that will be a - * key in the method cache. - */ - private static class Signature { - private Class targetClass; - private String methodName; - private Class[] argClasses; - - private volatile int hashCode = 0; - - public Signature(Class targetClass, String methodName, Class[] argClasses) { - this.targetClass = targetClass; - this.methodName = methodName; - this.argClasses = argClasses; - } - - public boolean equals(Object o2) { - if (this == o2) { - return true; - } - Signature that = (Signature)o2; - if (!(targetClass == that.targetClass)) { - return false; - } - if (!(methodName.equals(that.methodName))) { - return false; - } - if (argClasses.length != that.argClasses.length) { - return false; - } - for (int i = 0; i < argClasses.length; i++) { - if (!(argClasses[i] == that.argClasses[i])) { - return false; - } - } - return true; - } - - /** - * Hash code computed using algorithm suggested in - * Effective Java, Item 8. - */ - public int hashCode() { - if (hashCode == 0) { - int result = 17; - result = 37 * result + targetClass.hashCode(); - result = 37 * result + methodName.hashCode(); - if (argClasses != null) { - for (int i = 0; i < argClasses.length; i++) { - result = 37 * result + ((argClasses[i] == null) ? 0 : - argClasses[i].hashCode()); - } - } - hashCode = result; - } - return hashCode; - } - } - - /** - * A wrapper to findMethod(), which will search or populate the method - * in a cache. - * @throws exception if the method is ambiguios. - */ - public static synchronized Method getMethod(Class targetClass, - String methodName, - Class[] argClasses) { - Object signature = new Signature(targetClass, methodName, argClasses); - - Method method = null; - Map methodCache = null; - boolean cache = false; - if (ReflectUtil.isPackageAccessible(targetClass)) { - cache = true; - } - - if (cache && methodCacheRef != null && - (methodCache = (Map)methodCacheRef.get()) != null) { - method = (Method)methodCache.get(signature); - if (method != null) { - return method; - } - } - method = findMethod(targetClass, methodName, argClasses); - if (cache && method != null) { - if (methodCache == null) { - methodCache = new HashMap(); - methodCacheRef = new SoftReference(methodCache); - } - methodCache.put(signature, method); - } - return method; - } - - /** - * Return a constructor on the class with the arguments. - * - * @throws exception if the method is ambiguios. - */ - public static Constructor getConstructor(Class cls, Class[] args) { - Constructor constructor = null; - - // PENDING: Implement the resolutuion of ambiguities properly. - Constructor[] ctors = ConstructorUtil.getConstructors(cls); - for(int i = 0; i < ctors.length; i++) { - if (matchArguments(args, ctors[i].getParameterTypes())) { - constructor = ctors[i]; - } - } - return constructor; - } - - public static Object getPrivateField(Object instance, Class cls, String name) { - return getPrivateField(instance, cls, name, null); - } - - /** * Returns the value of a private field. * * @param instance object instance diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/beans/Statement.java --- a/jdk/src/share/classes/java/beans/Statement.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/beans/Statement.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,8 @@ import java.lang.reflect.Method; import com.sun.beans.finder.ClassFinder; +import com.sun.beans.finder.ConstructorFinder; +import com.sun.beans.finder.MethodFinder; import sun.reflect.misc.MethodUtil; /** @@ -195,13 +197,18 @@ argClasses[0] == String.class) { return new Character(((String)arguments[0]).charAt(0)); } - m = ReflectionUtils.getConstructor((Class)target, argClasses); + try { + m = ConstructorFinder.findConstructor((Class)target, argClasses); + } + catch (NoSuchMethodException exception) { + m = null; + } } if (m == null && target != Class.class) { - m = ReflectionUtils.getMethod((Class)target, methodName, argClasses); + m = getMethod((Class)target, methodName, argClasses); } if (m == null) { - m = ReflectionUtils.getMethod(Class.class, methodName, argClasses); + m = getMethod(Class.class, methodName, argClasses); } } else { @@ -224,7 +231,7 @@ return null; } } - m = ReflectionUtils.getMethod(target.getClass(), methodName, argClasses); + m = getMethod(target.getClass(), methodName, argClasses); } if (m != null) { try { @@ -289,4 +296,13 @@ result.append(");"); return result.toString(); } + + static Method getMethod(Class type, String name, Class... args) { + try { + return MethodFinder.findMethod(type, name, args); + } + catch (NoSuchMethodException exception) { + return null; + } + } } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/beans/XMLDecoder.java --- a/jdk/src/share/classes/java/beans/XMLDecoder.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/beans/XMLDecoder.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,19 +24,14 @@ */ package java.beans; -import com.sun.beans.ObjectHandler; +import com.sun.beans.decoder.DocumentHandler; +import java.io.Closeable; import java.io.InputStream; import java.io.IOException; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; - -import org.xml.sax.SAXException; - -import javax.xml.parsers.SAXParserFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; +import org.xml.sax.InputSource; +import org.xml.sax.helpers.DefaultHandler; /** * The XMLDecoder class is used to read XML documents @@ -66,11 +61,11 @@ * @author Philip Milne */ public class XMLDecoder { - private InputStream in; + private final DocumentHandler handler = new DocumentHandler(); + private final InputSource input; private Object owner; - private ExceptionListener exceptionListener; - private ObjectHandler handler; - private Reference clref; + private Object[] array; + private int index; /** * Creates a new input stream for reading archives @@ -126,36 +121,45 @@ */ public XMLDecoder(InputStream in, Object owner, ExceptionListener exceptionListener, ClassLoader cl) { - this.in = in; - setOwner(owner); - setExceptionListener(exceptionListener); - setClassLoader(cl); + this(new InputSource(in), owner, exceptionListener, cl); } /** - * Set the class loader used to instantiate objects for this stream. + * Creates a new decoder to parse XML archives + * created by the {@code XMLEncoder} class. + * If the input source {@code is} is {@code null}, + * no exception is thrown and no parsing is performed. + * This behavior is similar to behavior of other constructors + * that use {@code InputStream} as a parameter. * - * @param cl a classloader to use; if null then the default class loader - * will be used + * @param is the input source to parse + * + * @since 1.7 */ - private void setClassLoader(ClassLoader cl) { - if (cl != null) { - this.clref = new WeakReference(cl); - } + public XMLDecoder(InputSource is) { + this(is, null, null, null); } /** - * Return the class loader used to instantiate objects. If the class loader - * has not been explicitly set then null is returned. + * Creates a new decoder to parse XML archives + * created by the {@code XMLEncoder} class. * - * @return the class loader used to instantiate objects + * @param is the input source to parse + * @param owner the owner of this decoder + * @param el the exception handler for the parser, + * or {@code null} to use the default exception handler + * @param cl the class loader used for instantiating objects, + * or {@code null} to use the default class loader + * + * @since 1.7 */ - private ClassLoader getClassLoader() { - if (clref != null) { - return (ClassLoader)clref.get(); - } - return null; + private XMLDecoder(InputSource is, Object owner, ExceptionListener el, ClassLoader cl) { + this.input = is; + this.owner = owner; + setExceptionListener(el); + this.handler.setClassLoader(cl); + this.handler.setOwner(this); } /** @@ -163,8 +167,14 @@ * with this stream. */ public void close() { + if (parsingComplete()) { + close(this.input.getCharacterStream()); + close(this.input.getByteStream()); + } + } + + private void close(Closeable in) { if (in != null) { - getHandler(); try { in.close(); } @@ -174,6 +184,17 @@ } } + private boolean parsingComplete() { + if (this.input == null) { + return false; + } + if (this.array == null) { + this.handler.parse(this.input); + this.array = this.handler.getObjects(); + } + return true; + } + /** * Sets the exception handler for this stream to exceptionListener. * The exception handler is notified when this stream catches recoverable @@ -185,7 +206,10 @@ * @see #getExceptionListener */ public void setExceptionListener(ExceptionListener exceptionListener) { - this.exceptionListener = exceptionListener; + if (exceptionListener == null) { + exceptionListener = Statement.defaultExceptionListener; + } + this.handler.setExceptionListener(exceptionListener); } /** @@ -197,8 +221,7 @@ * @see #setExceptionListener */ public ExceptionListener getExceptionListener() { - return (exceptionListener != null) ? exceptionListener : - Statement.defaultExceptionListener; + return this.handler.getExceptionListener(); } /** @@ -212,10 +235,9 @@ * @see XMLEncoder#writeObject */ public Object readObject() { - if (in == null) { - return null; - } - return getHandler().dequeueResult(); + return (parsingComplete()) + ? this.array[this.index++] + : null; } /** @@ -241,33 +263,32 @@ } /** - * Returns the object handler for input stream. - * The object handler is created if necessary. + * Creates a new handler for SAX parser + * that can be used to parse embedded XML archives + * created by the {@code XMLEncoder} class. * - * @return the object handler + * The {@code owner} should be used if parsed XML document contains + * the method call within context of the <java> element. + * The {@code null} value may cause illegal parsing in such case. + * The same problem may occur, if the {@code owner} class + * does not contain expected method to call. See details here. + * + * @param owner the owner of the default handler + * that can be used as a value of <java> element + * @param el the exception handler for the parser, + * or {@code null} to use the default exception handler + * @param cl the class loader used for instantiating objects, + * or {@code null} to use the default class loader + * @return an instance of {@code DefaultHandler} for SAX parser + * + * @since 1.7 */ - private ObjectHandler getHandler() { - if ( handler == null ) { - SAXParserFactory factory = SAXParserFactory.newInstance(); - try { - SAXParser parser = factory.newSAXParser(); - handler = new ObjectHandler( this, getClassLoader() ); - parser.parse( in, handler ); - } - catch ( ParserConfigurationException e ) { - getExceptionListener().exceptionThrown( e ); - } - catch ( SAXException se ) { - Exception e = se.getException(); - if ( e == null ) { - e = se; - } - getExceptionListener().exceptionThrown( e ); - } - catch ( IOException ioe ) { - getExceptionListener().exceptionThrown( ioe ); - } - } + public static DefaultHandler createHandler(Object owner, ExceptionListener el, ClassLoader cl) { + DocumentHandler handler = new DocumentHandler(); + handler.setOwner(owner); + handler.setExceptionListener(el); + handler.setClassLoader(cl); return handler; } } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/util/Calendar.java --- a/jdk/src/share/classes/java/util/Calendar.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/util/Calendar.java Thu Feb 05 09:24:45 2009 -0800 @@ -1190,7 +1190,9 @@ */ public void set(int field, int value) { - if (isLenient() && areFieldsSet && !areAllFieldsSet) { + // If the fields are partially normalized, calculate all the + // fields before changing any fields. + if (areFieldsSet && !areAllFieldsSet) { computeFields(); } internalSet(field, value); diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/util/CurrencyData.properties --- a/jdk/src/share/classes/java/util/CurrencyData.properties Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/util/CurrencyData.properties Thu Feb 05 09:24:45 2009 -0800 @@ -441,12 +441,16 @@ RU=RUB # RWANDA RW=RWF +# SAINT BARTHELEMY +BL=EUR # SAINT HELENA SH=SHP # SAINT KITTS AND NEVIS KN=XCD # SAINT LUCIA LC=XCD +# SAINT MARTIN +MF=EUR # SAINT PIERRE AND MIQUELON PM=EUR # SAINT VINCENT AND THE GRENADINES diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/java/util/LocaleISOData.java --- a/jdk/src/share/classes/java/util/LocaleISOData.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/java/util/LocaleISOData.java Thu Feb 05 09:24:45 2009 -0800 @@ -250,6 +250,7 @@ + "BH" + "BHR" // Bahrain, Kingdom of + "BI" + "BDI" // Burundi, Republic of + "BJ" + "BEN" // Benin, People's Republic of + + "BL" + "BLM" // Saint Barth\u00e9lemy + "BM" + "BMU" // Bermuda + "BN" + "BRN" // Brunei Darussalam + "BO" + "BOL" // Bolivia, Republic of @@ -273,7 +274,7 @@ + "CN" + "CHN" // China, People's Republic of + "CO" + "COL" // Colombia, Republic of + "CR" + "CRI" // Costa Rica, Republic of - + "CS" + "SCG" // Serbia and Montenegro +// + "CS" + "SCG" // Serbia and Montenegro + "CU" + "CUB" // Cuba, Republic of + "CV" + "CPV" // Cape Verde, Republic of + "CX" + "CXR" // Christmas Island @@ -363,6 +364,7 @@ + "MC" + "MCO" // Monaco, Principality of + "MD" + "MDA" // Moldova, Republic of + "ME" + "MNE" // Montenegro, Republic of + + "MF" + "MAF" // Saint Martin + "MG" + "MDG" // Madagascar, Republic of + "MH" + "MHL" // Marshall Islands + "MK" + "MKD" // Macedonia, the former Yugoslav Republic of diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/ImageIcon.java --- a/jdk/src/share/classes/javax/swing/ImageIcon.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/ImageIcon.java Thu Feb 05 09:24:45 2009 -0800 @@ -86,7 +86,7 @@ static { component = new Component() {}; - AccessController.doPrivileged(new PrivilegedAction() { + AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { // 6482575 - clear the appContext field so as not to leak it diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/ProgressMonitor.java --- a/jdk/src/share/classes/javax/swing/ProgressMonitor.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/ProgressMonitor.java Thu Feb 05 09:24:45 2009 -0800 @@ -78,7 +78,7 @@ * @author James Gosling * @author Lynn Monsanto (accessibility) */ -public class ProgressMonitor extends Object implements Accessible +public class ProgressMonitor implements Accessible { private ProgressMonitor root; private JDialog dialog; @@ -186,7 +186,7 @@ } if (window instanceof SwingUtilities.SharedOwnerFrame) { WindowListener ownerShutdownListener = - (WindowListener)SwingUtilities.getSharedOwnerFrameShutdownListener(); + SwingUtilities.getSharedOwnerFrameShutdownListener(); dialog.addWindowListener(ownerShutdownListener); } Container contentPane = dialog.getContentPane(); @@ -273,7 +273,7 @@ if (dT >= millisToDecideToPopup) { int predictedCompletionTime; if (nv > min) { - predictedCompletionTime = (int)((long)dT * + predictedCompletionTime = (int)(dT * (max - min) / (nv - min)); } @@ -691,10 +691,7 @@ * object does not have an Accessible parent */ public Accessible getAccessibleParent() { - if (dialog != null) { - return (Accessible)dialog; - } - return null; + return dialog; } /* @@ -768,7 +765,7 @@ if (myBar != null) { Component c = myBar.getParent(); if (c instanceof Accessible) { - return ((Accessible)c).getAccessibleContext(); + return c.getAccessibleContext(); } } return null; diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/RepaintManager.java --- a/jdk/src/share/classes/javax/swing/RepaintManager.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/RepaintManager.java Thu Feb 05 09:24:45 2009 -0800 @@ -1305,9 +1305,12 @@ if (doubleBufferingEnabled && !nativeDoubleBuffering) { switch (bufferStrategyType) { case BUFFER_STRATEGY_NOT_SPECIFIED: - if (((SunToolkit)Toolkit.getDefaultToolkit()). - useBufferPerWindow()) { - paintManager = new BufferStrategyPaintManager(); + Toolkit tk = Toolkit.getDefaultToolkit(); + if (tk instanceof SunToolkit) { + SunToolkit stk = (SunToolkit) tk; + if (stk.useBufferPerWindow()) { + paintManager = new BufferStrategyPaintManager(); + } } break; case BUFFER_STRATEGY_SPECIFIED_ON: @@ -1329,9 +1332,16 @@ private void scheduleProcessingRunnable(AppContext context) { if (processingRunnable.markPending()) { - SunToolkit.getSystemEventQueueImplPP(context). - postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), - processingRunnable)); + Toolkit tk = Toolkit.getDefaultToolkit(); + if (tk instanceof SunToolkit) { + SunToolkit.getSystemEventQueueImplPP(context). + postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), + processingRunnable)); + } else { + Toolkit.getDefaultToolkit().getSystemEventQueue(). + postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), + processingRunnable)); + } } } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/SwingWorker.java --- a/jdk/src/share/classes/javax/swing/SwingWorker.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/SwingWorker.java Thu Feb 05 09:24:45 2009 -0800 @@ -282,7 +282,7 @@ * is finished. */ DONE - }; + } /** * Constructs this {@code SwingWorker}. @@ -825,7 +825,7 @@ } private static class DoSubmitAccumulativeRunnable extends AccumulativeRunnable implements ActionListener { - private final static int DELAY = (int) (1000 / 30); + private final static int DELAY = 1000 / 30; @Override protected void run(List args) { for (Runnable runnable : args) { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java --- a/jdk/src/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java Thu Feb 05 09:24:45 2009 -0800 @@ -26,6 +26,8 @@ package javax.swing.colorchooser; import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.*; /** @@ -47,6 +49,15 @@ */ public abstract class AbstractColorChooserPanel extends JPanel { + private final PropertyChangeListener enabledListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + Object value = event.getNewValue(); + if (value instanceof Boolean) { + setEnabled((Boolean) value); + } + } + }; + /** * */ @@ -142,6 +153,8 @@ throw new RuntimeException ("This chooser panel is already installed"); } chooser = enclosingChooser; + chooser.addPropertyChangeListener("enabled", enabledListener); + setEnabled(chooser.isEnabled()); buildChooser(); updateChooser(); } @@ -151,6 +164,7 @@ * If override this, be sure to call super. */ public void uninstallChooserPanel(JColorChooser enclosingChooser) { + chooser.removePropertyChangeListener("enabled", enabledListener); chooser = null; } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/colorchooser/ColorChooserPanel.java --- a/jdk/src/share/classes/javax/swing/colorchooser/ColorChooserPanel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/colorchooser/ColorChooserPanel.java Thu Feb 05 09:24:45 2009 -0800 @@ -26,6 +26,8 @@ package javax.swing.colorchooser; import java.awt.Color; +import java.awt.Component; +import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.beans.PropertyChangeEvent; @@ -57,6 +59,21 @@ } @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + setEnabled(this, enabled); + } + + private static void setEnabled(Container container, boolean enabled) { + for (Component component : container.getComponents()) { + component.setEnabled(enabled); + if (component instanceof Container) { + setEnabled((Container) component, enabled); + } + } + } + + @Override public void updateChooser() { Color color = getColorFromModel(); if (color != null) { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java --- a/jdk/src/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java Thu Feb 05 09:24:45 2009 -0800 @@ -128,8 +128,7 @@ * @since 1.4 */ public ChangeListener[] getChangeListeners() { - return (ChangeListener[])listenerList.getListeners( - ChangeListener.class); + return listenerList.getListeners(ChangeListener.class); } /** diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java --- a/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java Thu Feb 05 09:24:45 2009 -0800 @@ -170,7 +170,6 @@ superHolder.add(mainHolder, gbc); gbc.insets = oldInsets; - recentSwatchPanel.addMouseListener(recentSwatchListener); recentSwatchPanel.setInheritsPopupMenu(true); JPanel recentHolder = new JPanel( new BorderLayout() ); recentHolder.setBorder(border); @@ -212,16 +211,20 @@ class RecentSwatchListener extends MouseAdapter implements Serializable { public void mousePressed(MouseEvent e) { - Color color = recentSwatchPanel.getColorForLocation(e.getX(), e.getY()); - setSelectedColor(color); + if (isEnabled()) { + Color color = recentSwatchPanel.getColorForLocation(e.getX(), e.getY()); + setSelectedColor(color); + } } } class MainSwatchListener extends MouseAdapter implements Serializable { public void mousePressed(MouseEvent e) { - Color color = swatchPanel.getColorForLocation(e.getX(), e.getY()); - setSelectedColor(color); - recentSwatchPanel.setMostRecentColor(color); + if (isEnabled()) { + Color color = swatchPanel.getColorForLocation(e.getX(), e.getY()); + setSelectedColor(color); + recentSwatchPanel.setMostRecentColor(color); + } } } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Thu Feb 05 09:24:45 2009 -0800 @@ -1132,13 +1132,18 @@ private void changeDirectory(File dir) { JFileChooser fc = getFileChooser(); // Traverse shortcuts on Windows - if (dir != null && File.separatorChar == '\\' && dir.getPath().endsWith(".lnk")) { + if (dir != null && FilePane.usesShellFolder(fc)) { try { - File linkedTo = ShellFolder.getShellFolder(dir).getLinkLocation(); - if (linkedTo != null && fc.isTraversable(linkedTo)) { - dir = linkedTo; - } else { - return; + ShellFolder shellFolder = ShellFolder.getShellFolder(dir); + + if (shellFolder.isLink()) { + File linkedTo = shellFolder.getLinkLocation(); + + if (linkedTo != null && fc.isTraversable(linkedTo)) { + dir = linkedTo; + } else { + return; + } } } catch (FileNotFoundException ex) { return; diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Thu Feb 05 09:24:45 2009 -0800 @@ -836,18 +836,24 @@ */ protected Integer getHighestValue() { Dictionary dictionary = slider.getLabelTable(); - if (dictionary != null) { - Enumeration keys = dictionary.keys(); - int max = slider.getMinimum() - 1; - while (keys.hasMoreElements()) { - max = Math.max(max, ((Integer)keys.nextElement()).intValue()); + + if (dictionary == null) { + return null; + } + + Enumeration keys = dictionary.keys(); + + Integer max = null; + + while (keys.hasMoreElements()) { + Integer i = (Integer) keys.nextElement(); + + if (max == null || i > max) { + max = i; } - if (max == slider.getMinimum() - 1) { - return null; - } - return max; } - return null; + + return max; } /** @@ -859,18 +865,24 @@ */ protected Integer getLowestValue() { Dictionary dictionary = slider.getLabelTable(); - if (dictionary != null) { - Enumeration keys = dictionary.keys(); - int min = slider.getMaximum() + 1; - while (keys.hasMoreElements()) { - min = Math.min(min, ((Integer)keys.nextElement()).intValue()); + + if (dictionary == null) { + return null; + } + + Enumeration keys = dictionary.keys(); + + Integer min = null; + + while (keys.hasMoreElements()) { + Integer i = (Integer) keys.nextElement(); + + if (min == null || i < min) { + min = i; } - if (min == slider.getMaximum() + 1) { - return null; - } - return min; } - return null; + + return min; } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java --- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Thu Feb 05 09:24:45 2009 -0800 @@ -68,8 +68,6 @@ private JToggleButton listViewButton; private JToggleButton detailsViewButton; - private boolean useShellFolder; - private JButton approveButton; private JButton cancelButton; @@ -204,10 +202,6 @@ public ListSelectionListener createListSelectionListener() { return MetalFileChooserUI.this.createListSelectionListener(getFileChooser()); } - - public boolean usesShellFolder() { - return useShellFolder; - } } public void installComponents(JFileChooser fc) { @@ -219,8 +213,6 @@ filePane = new FilePane(new MetalFileChooserUIAccessor()); fc.addPropertyChangeListener(filePane); - updateUseShellFolder(); - // ********************************* // // **** Construct the top panel **** // // ********************************* // @@ -448,19 +440,6 @@ groupLabels(new AlignedLabel[] { fileNameLabel, filesOfTypeLabel }); } - private void updateUseShellFolder() { - // Decide whether to use the ShellFolder class to populate shortcut - // panel and combobox. - JFileChooser fc = getFileChooser(); - Boolean prop = - (Boolean)fc.getClientProperty("FileChooser.useShellFolder"); - if (prop != null) { - useShellFolder = prop.booleanValue(); - } else { - useShellFolder = fc.getFileSystemView().equals(FileSystemView.getFileSystemView()); - } - } - protected JPanel getButtonPanel() { if (buttonPanel == null) { buttonPanel = new JPanel(); @@ -786,7 +765,6 @@ cc.applyComponentOrientation(o); } } else if (s == "FileChooser.useShellFolder") { - updateUseShellFolder(); doDirectoryChanged(e); } else if (s.equals("ancestor")) { if (e.getOldValue() == null && e.getNewValue() != null) { @@ -953,6 +931,8 @@ return; } + boolean useShellFolder = FilePane.usesShellFolder(chooser); + directories.clear(); File[] baseFolders; diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java Thu Feb 05 09:24:45 2009 -0800 @@ -59,16 +59,16 @@ import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.xml.sax.AttributeList; -import org.xml.sax.HandlerBase; +import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; -import com.sun.beans.ObjectHandler; +import com.sun.beans.decoder.DocumentHandler; -class SynthParser extends HandlerBase { +class SynthParser extends DefaultHandler { // // Known element names // @@ -119,7 +119,7 @@ /** * Lazily created, used for anything we don't understand. */ - private ObjectHandler _handler; + private DocumentHandler _handler; /** * Indicates the depth of how many elements we've encountered but don't @@ -292,8 +292,9 @@ /** * Handles beans persistance. */ - private ObjectHandler getHandler() { + private DocumentHandler getHandler() { if (_handler == null) { + _handler = new DocumentHandler(); if (_urlResourceBase != null) { // getHandler() is never called before parse() so it is safe // to create a URLClassLoader with _resourceBase. @@ -304,14 +305,13 @@ URL[] urls = new URL[] { getResource(".") }; ClassLoader parent = Thread.currentThread().getContextClassLoader(); ClassLoader urlLoader = new URLClassLoader(urls, parent); - _handler = new ObjectHandler(null, urlLoader); + _handler.setClassLoader(urlLoader); } else { - _handler = new ObjectHandler(null, - _classResourceBase.getClassLoader()); + _handler.setClassLoader(_classResourceBase.getClassLoader()); } for (String key : _mapping.keySet()) { - _handler.register(key, _mapping.get(key)); + _handler.setVariable(key, _mapping.get(key)); } } return _handler; @@ -336,8 +336,8 @@ private Object lookup(String key, Class type) throws SAXException { Object value; if (_handler != null) { - if ((value = _handler.lookup(key)) != null) { - return checkCast(value, type); + if (_handler.hasVariable(key)) { + return checkCast(_handler.getVariable(key), type); } } value = _mapping.get(key); @@ -354,11 +354,11 @@ private void register(String key, Object value) throws SAXException { if (key != null) { if (_mapping.get(key) != null || - (_handler != null && _handler.lookup(key) != null)) { + (_handler != null && _handler.hasVariable(key))) { throw new SAXException("ID " + key + " is already defined"); } if (_handler != null) { - _handler.register(key, value); + _handler.setVariable(key, value); } else { _mapping.put(key, value); @@ -400,12 +400,12 @@ // The following methods are invoked from startElement/stopElement // - private void startStyle(AttributeList attributes) throws SAXException { + private void startStyle(Attributes attributes) throws SAXException { String id = null; _style = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_CLONE)) { _style = (ParsedSynthStyle)((ParsedSynthStyle)lookup( attributes.getValue(i), ParsedSynthStyle.class)). @@ -421,7 +421,7 @@ register(id, _style); } - private void endStyle() throws SAXException { + private void endStyle() { int size = _stylePainters.size(); if (size > 0) { _style.setPainters(_stylePainters.toArray(new ParsedSynthStyle.PainterInfo[size])); @@ -435,14 +435,14 @@ _style = null; } - private void startState(AttributeList attributes) throws SAXException { + private void startState(Attributes attributes) throws SAXException { ParsedSynthStyle.StateInfo stateInfo = null; int state = 0; String id = null; _stateInfo = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); } @@ -496,7 +496,7 @@ _stateInfos.add(_stateInfo); } - private void endState() throws SAXException { + private void endState() { int size = _statePainters.size(); if (size > 0) { _stateInfo.setPainters(_statePainters.toArray(new ParsedSynthStyle.PainterInfo[size])); @@ -505,7 +505,7 @@ _stateInfo = null; } - private void startFont(AttributeList attributes) throws SAXException { + private void startFont(Attributes attributes) throws SAXException { Font font = null; int style = Font.PLAIN; int size = 0; @@ -513,7 +513,7 @@ String name = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); } @@ -568,13 +568,13 @@ } } - private void startColor(AttributeList attributes) throws SAXException { + private void startColor(Attributes attributes) throws SAXException { Color color = null; String id = null; _colorTypes.clear(); for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); } @@ -697,7 +697,7 @@ } } - private void startProperty(AttributeList attributes, + private void startProperty(Attributes attributes, Object property) throws SAXException { Object value = null; String key = null; @@ -707,7 +707,7 @@ String aValue = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String aName = attributes.getName(i); + String aName = attributes.getQName(i); if (aName.equals(ATTRIBUTE_TYPE)) { String type = attributes.getValue(i).toUpperCase(); if (type.equals("IDREF")) { @@ -795,11 +795,11 @@ } } - private void startGraphics(AttributeList attributes) throws SAXException { + private void startGraphics(Attributes attributes) throws SAXException { SynthGraphicsUtils graphics = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_IDREF)) { graphics = (SynthGraphicsUtils)lookup(attributes.getValue(i), SynthGraphicsUtils.class); @@ -813,7 +813,7 @@ } } - private void startInsets(AttributeList attributes) throws SAXException { + private void startInsets(Attributes attributes) throws SAXException { int top = 0; int bottom = 0; int left = 0; @@ -822,7 +822,7 @@ String id = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); try { if (key.equals(ATTRIBUTE_IDREF)) { @@ -858,13 +858,13 @@ } } - private void startBind(AttributeList attributes) throws SAXException { + private void startBind(Attributes attributes) throws SAXException { ParsedSynthStyle style = null; String path = null; int type = -1; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_STYLE)) { style = (ParsedSynthStyle)lookup(attributes.getValue(i), @@ -899,7 +899,7 @@ } } - private void startPainter(AttributeList attributes, String type) throws SAXException { + private void startPainter(Attributes attributes, String type) throws SAXException { Insets sourceInsets = null; Insets destInsets = null; String path = null; @@ -915,7 +915,7 @@ boolean paintCenterSpecified = false; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); String value = attributes.getValue(i); if (key.equals(ATTRIBUTE_ID)) { @@ -1042,12 +1042,12 @@ painters.add(painterInfo); } - private void startImageIcon(AttributeList attributes) throws SAXException { + private void startImageIcon(Attributes attributes) throws SAXException { String path = null; String id = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); @@ -1062,12 +1062,11 @@ register(id, new LazyImageIcon(getResource(path))); } - private void startOpaque(AttributeList attributes) throws - SAXException { + private void startOpaque(Attributes attributes) { if (_style != null) { _style.setOpaque(true); for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_VALUE)) { _style.setOpaque("true".equals(attributes.getValue(i). @@ -1077,12 +1076,12 @@ } } - private void startInputMap(AttributeList attributes) throws SAXException { + private void startInputMap(Attributes attributes) throws SAXException { _inputMapBindings.clear(); _inputMapID = null; if (_style != null) { for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { _inputMapID = attributes.getValue(i); @@ -1101,7 +1100,7 @@ _inputMapID = null; } - private void startBindKey(AttributeList attributes) throws SAXException { + private void startBindKey(Attributes attributes) throws SAXException { if (_inputMapID == null) { // Not in an inputmap, bail. return; @@ -1110,7 +1109,7 @@ String key = null; String value = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String aKey = attributes.getName(i); + String aKey = attributes.getQName(i); if (aKey.equals(ATTRIBUTE_KEY)) { key = attributes.getValue(i); @@ -1129,26 +1128,26 @@ } // - // SAX methods, these forward to the ObjectHandler if we don't know + // SAX methods, these forward to the DocumentHandler if we don't know // the element name. // public InputSource resolveEntity(String publicId, String systemId) - throws SAXException { + throws IOException, SAXException { if (isForwarding()) { return getHandler().resolveEntity(publicId, systemId); } return null; } - public void notationDecl(String name, String publicId, String systemId) { + public void notationDecl(String name, String publicId, String systemId) throws SAXException { if (isForwarding()) { getHandler().notationDecl(name, publicId, systemId); } } public void unparsedEntityDecl(String name, String publicId, - String systemId, String notationName) { + String systemId, String notationName) throws SAXException { if (isForwarding()) { getHandler().unparsedEntityDecl(name, publicId, systemId, notationName); @@ -1173,7 +1172,7 @@ } } - public void startElement(String name, AttributeList attributes) + public void startElement(String uri, String local, String name, Attributes attributes) throws SAXException { name = name.intern(); if (name == ELEMENT_STYLE) { @@ -1223,18 +1222,18 @@ } else if (name != ELEMENT_SYNTH) { if (_depth++ == 0) { - getHandler().reset(); + getHandler().startDocument(); } - getHandler().startElement(name, attributes); + getHandler().startElement(uri, local, name, attributes); } } - public void endElement(String name) throws SAXException { + public void endElement(String uri, String local, String name) throws SAXException { if (isForwarding()) { - getHandler().endElement(name); + getHandler().endElement(uri, local, name); _depth--; if (!isForwarding()) { - getHandler().reset(); + getHandler().startDocument(); } } else { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/table/DefaultTableColumnModel.java --- a/jdk/src/share/classes/javax/swing/table/DefaultTableColumnModel.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/table/DefaultTableColumnModel.java Thu Feb 05 09:24:45 2009 -0800 @@ -190,7 +190,7 @@ fireColumnMoved(new TableColumnModelEvent(this, columnIndex, newIndex)); return; } - aColumn = (TableColumn)tableColumns.elementAt(columnIndex); + aColumn = tableColumns.elementAt(columnIndex); tableColumns.removeElementAt(columnIndex); boolean selected = selectionModel.isSelectedIndex(columnIndex); @@ -291,7 +291,7 @@ * at columnIndex */ public TableColumn getColumn(int columnIndex) { - return (TableColumn)tableColumns.elementAt(columnIndex); + return tableColumns.elementAt(columnIndex); } /** @@ -504,8 +504,7 @@ * @since 1.4 */ public TableColumnModelListener[] getColumnModelListeners() { - return (TableColumnModelListener[])listenerList.getListeners( - TableColumnModelListener.class); + return listenerList.getListeners(TableColumnModelListener.class); } // diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/tree/DefaultMutableTreeNode.java --- a/jdk/src/share/classes/javax/swing/tree/DefaultMutableTreeNode.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/tree/DefaultMutableTreeNode.java Thu Feb 05 09:24:45 2009 -0800 @@ -84,7 +84,7 @@ * * @author Rob Davis */ -public class DefaultMutableTreeNode extends Object implements Cloneable, +public class DefaultMutableTreeNode implements Cloneable, MutableTreeNode, Serializable { private static final long serialVersionUID = -4298474751201349152L; @@ -1251,7 +1251,7 @@ * @return a copy of this node */ public Object clone() { - DefaultMutableTreeNode newNode = null; + DefaultMutableTreeNode newNode; try { newNode = (DefaultMutableTreeNode)super.clone(); @@ -1297,24 +1297,22 @@ userObject = tValues[1]; } - final class PreorderEnumeration implements Enumeration { - protected Stack stack; + private final class PreorderEnumeration implements Enumeration { + private final Stack stack = new Stack(); public PreorderEnumeration(TreeNode rootNode) { super(); - Vector v = new Vector(1); + Vector v = new Vector(1); v.addElement(rootNode); // PENDING: don't really need a vector - stack = new Stack(); stack.push(v.elements()); } public boolean hasMoreElements() { - return (!stack.empty() && - ((Enumeration)stack.peek()).hasMoreElements()); + return (!stack.empty() && stack.peek().hasMoreElements()); } public TreeNode nextElement() { - Enumeration enumer = (Enumeration)stack.peek(); + Enumeration enumer = stack.peek(); TreeNode node = (TreeNode)enumer.nextElement(); Enumeration children = node.children(); @@ -1353,8 +1351,7 @@ if (subtree.hasMoreElements()) { retval = subtree.nextElement(); } else if (children.hasMoreElements()) { - subtree = new PostorderEnumeration( - (TreeNode)children.nextElement()); + subtree = new PostorderEnumeration(children.nextElement()); retval = subtree.nextElement(); } else { retval = root; @@ -1373,7 +1370,7 @@ public BreadthFirstEnumeration(TreeNode rootNode) { super(); - Vector v = new Vector(1); + Vector v = new Vector(1); v.addElement(rootNode); // PENDING: don't really need a vector queue = new Queue(); queue.enqueue(v.elements()); diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/javax/swing/undo/CompoundEdit.java --- a/jdk/src/share/classes/javax/swing/undo/CompoundEdit.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/undo/CompoundEdit.java Thu Feb 05 09:24:45 2009 -0800 @@ -59,7 +59,7 @@ super.undo(); int i = edits.size(); while (i-- > 0) { - UndoableEdit e = (UndoableEdit)edits.elementAt(i); + UndoableEdit e = edits.elementAt(i); e.undo(); } } @@ -85,7 +85,7 @@ protected UndoableEdit lastEdit() { int count = edits.size(); if (count > 0) - return (UndoableEdit)edits.elementAt(count-1); + return edits.elementAt(count-1); else return null; } @@ -98,7 +98,7 @@ int size = edits.size(); for (int i = size-1; i >= 0; i--) { - UndoableEdit e = (UndoableEdit)edits.elementAt(i); + UndoableEdit e = edits.elementAt(i); // System.out.println("CompoundEdit(" + i + "): Discarding " + // e.getUndoPresentationName()); e.die(); diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/beans/editors/EnumEditor.java --- a/jdk/src/share/classes/sun/beans/editors/EnumEditor.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/beans/editors/EnumEditor.java Thu Feb 05 09:24:45 2009 -0800 @@ -67,7 +67,7 @@ } public void setValue( Object value ) { - if ( ( value != null ) && ( this.type != value.getClass() ) ) { + if ( ( value != null ) && !this.type.isInstance( value ) ) { throw new IllegalArgumentException( "Unsupported value: " + value ); } Object oldValue; diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/swing/FilePane.java --- a/jdk/src/share/classes/sun/swing/FilePane.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/swing/FilePane.java Thu Feb 05 09:24:45 2009 -0800 @@ -689,7 +689,7 @@ void updateColumnInfo() { File dir = chooser.getCurrentDirectory(); - if (dir != null && fileChooserUIAccessor.usesShellFolder()) { + if (dir != null && usesShellFolder(chooser)) { try { dir = ShellFolder.getShellFolder(dir); } catch (FileNotFoundException e) { @@ -1947,7 +1947,7 @@ if (f instanceof ShellFolder) { return ((ShellFolder) f).isFileSystem(); } else { - if (fileChooserUIAccessor.usesShellFolder()) { + if (usesShellFolder(getFileChooser())) { try { return ShellFolder.getShellFolder(f).isFileSystem(); } catch (FileNotFoundException ex) { @@ -1961,6 +1961,16 @@ } } + /** + * Returns true if specified FileChooser should use ShellFolder + */ + public static boolean usesShellFolder(JFileChooser chooser) { + Boolean prop = (Boolean) chooser.getClientProperty("FileChooser.useShellFolder"); + + return prop == null ? chooser.getFileSystemView().equals(FileSystemView.getFileSystemView()) + : prop.booleanValue(); + } + // This interface is used to access methods in the FileChooserUI // that are not public. public interface FileChooserUIAccessor { @@ -1975,6 +1985,5 @@ public Action getNewFolderAction(); public MouseListener createDoubleClickListener(JList list); public ListSelectionListener createListSelectionListener(); - public boolean usesShellFolder(); } } diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java --- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -71,8 +71,6 @@ private JToggleButton listViewButton; private JToggleButton detailsViewButton; - private boolean useShellFolder; - private boolean readOnly; private JPanel buttonPanel; @@ -185,10 +183,6 @@ public ListSelectionListener createListSelectionListener() { return SynthFileChooserUIImpl.this.createListSelectionListener(getFileChooser()); } - - public boolean usesShellFolder() { - return useShellFolder; - } } protected void installDefaults(JFileChooser fc) { @@ -201,8 +195,6 @@ SynthContext context = getContext(fc, ENABLED); - updateUseShellFolder(); - fc.setLayout(new BorderLayout(0, 11)); // ********************************* // @@ -432,20 +424,6 @@ super.uninstallListeners(fc); } - private void updateUseShellFolder() { - // Decide whether to use the ShellFolder class to populate shortcut - // panel and combobox. - JFileChooser fc = getFileChooser(); - Boolean prop = - (Boolean)fc.getClientProperty("FileChooser.useShellFolder"); - if (prop != null) { - useShellFolder = prop.booleanValue(); - } else { - useShellFolder = fc.getFileSystemView().equals(FileSystemView.getFileSystemView()); - } - } - - private String fileNameString(File file) { if (file == null) { return null; @@ -761,6 +739,8 @@ return; } + boolean useShellFolder = FilePane.usesShellFolder(chooser); + int oldSize = directories.size(); directories.clear(); if (oldSize > 0) { diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/text/resources/FormatData_th.java --- a/jdk/src/share/classes/sun/text/resources/FormatData_th.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/text/resources/FormatData_th.java Thu Feb 05 09:24:45 2009 -0800 @@ -47,6 +47,19 @@ * Overrides ListResourceBundle */ protected final Object[][] getContents() { + String[] dateTimePatterns = new String[] { + "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35 'ss' \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35'", // full time pattern + "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35'", // long time pattern + "H:mm:ss", // medium time pattern + "H:mm' \u0e19.'", // short time pattern (modified) -- add ' \u0e19.' + // (it means something like "o'clock" in english) + "EEEE'\u0e17\u0e35\u0e48 'd MMMM G yyyy", // full date pattern + "d MMMM yyyy", // long date pattern + "d MMM yyyy", // medium date pattern + "d/M/yyyy", // short date pattern + "{1}, {0}" // date-time pattern + }; + return new Object[][] { { "MonthNames", new String[] { @@ -129,18 +142,10 @@ } }, { "sun.util.BuddhistCalendar.DateTimePatterns", - new String[] { - "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35 'ss' \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35'", // full time pattern - "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35'", // long time pattern - "H:mm:ss", // medium time pattern - "H:mm' \u0e19.'", // short time pattern (modified) -- add ' \u0e19.' - // (it means something like "o'clock" in english) - "EEEE'\u0e17\u0e35\u0e48 'd MMMM G yyyy", // full date pattern - "d MMMM yyyy", // long date pattern - "d MMM yyyy", // medium date pattern - "d/M/yyyy", // short date pattern - "{1}, {0}" // date-time pattern - } + dateTimePatterns + }, + { "DateTimePatterns", + dateTimePatterns }, { "DateTimePatternChars", "GanjkHmsSEDFwWxhKzZ" }, }; diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/LocaleNames.properties --- a/jdk/src/share/classes/sun/util/resources/LocaleNames.properties Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/LocaleNames.properties Thu Feb 05 09:24:45 2009 -0800 @@ -257,6 +257,7 @@ BH=Bahrain BI=Burundi BJ=Benin +BL=Saint Barth\u00e9lemy BM=Bermuda BN=Brunei BO=Bolivia @@ -370,6 +371,7 @@ MC=Monaco MD=Moldova ME=Montenegro +MF=Saint Martin MG=Madagascar MH=Marshall Islands MK=Macedonia diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "Malaysia Summer Time", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT", "Fernando de Noronha Summer Time", "FNST"}; + String NPT[] = new String[] {"Nepal Time", "NPT", + "Nepal Summer Time", "NPST"}; String NST[] = new String[] {"Newfoundland Standard Time", "NST", "Newfoundland Daylight Time", "NDT"}; String NZST[] = new String[] {"New Zealand Standard Time", "NZST", @@ -151,6 +153,8 @@ "Pakistan Summer Time", "PKST"}; String PST[] = new String[] {"Pacific Standard Time", "PST", "Pacific Daylight Time", "PDT"}; + String RST[] = new String[] {"Eastern Standard Time", "EST", + "Central Daylight Time", "CDT"}; String SAST[] = new String[] {"South Africa Standard Time", "SAST", "South Africa Summer Time", "SAST"}; String SBT[] = new String[] {"Solomon Is. Time", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "Petropavlovsk-Kamchatski Summer Time", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Nepal Time", "NPT", - "Nepal Summer Time", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Krasnoyarsk Time", "KRAT", "Krasnoyarsk Summer Time", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "Malaysische Sommerzeit", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha Zeit", "FNT", "Fernando de Noronha Sommerzeit", "FNST"}; + String NPT[] = new String[] {"Nepalesische Zeit", "NPT", + "Nepalesische Sommerzeit", "NPST"}; String NST[] = new String[] {"Neufundland Normalzeit", "NST", "Neufundland Sommerzeit", "NDT"}; String NZST[] = new String[] {"Neuseeland Normalzeit", "NZST", @@ -151,6 +153,8 @@ "Pakistanische Sommerzeit", "PKST"}; String PST[] = new String[] {"Pazifische Normalzeit", "PST", "Pazifische Sommerzeit", "PDT"}; + String RST[] = new String[] {"\u00d6stliche Normalzeit", "EST", + "Zentrale Sommerzeit", "CDT"}; String SAST[] = new String[] {"S\u00fcdafrikanische Normalzeit", "SAST", "S\u00fcdafrikanische Sommerzeit", "SAST"}; String SBT[] = new String[] {"Salomoninseln Zeit", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "Petropawlowsk-Kamtschatkische Sommerzeit", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Nepalesische Zeit", "NPT", - "Nepalesische Sommerzeit", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Krasnojarsker Zeit", "KRAT", "Krasnojarsker Sommerzeit", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "Hora de verano de Malasia", "MYST"}; String NORONHA[] = new String[] {"Hora de Fernando de Noronha", "FNT", "Hora de verano de Fernando de Noronha", "FNST"}; + String NPT[] = new String[] {"Hora de Nepal", "NPT", + "Hora de verano de Nepal", "NPST"}; String NST[] = new String[] {"Hora est\u00e1ndar de Terranova", "NST", "Hora de verano de Terranova", "NDT"}; String NZST[] = new String[] {"Hora est\u00e1ndar de Nueva Zelanda", "NZST", @@ -151,6 +153,8 @@ "Hora de verano de Pakist\u00e1n", "PKST"}; String PST[] = new String[] {"Hora est\u00e1ndar del Pac\u00edfico", "PST", "Hora de verano del Pac\u00edfico", "PDT"}; + String RST[] = new String[] {"Hora est\u00e1ndar Oriental", "EST", + "Hora de verano Central", "CDT"}; String SAST[] = new String[] {"Hora est\u00e1ndar de Sud\u00e1frica", "SAST", "Hora de verano de Sud\u00e1frica", "SAST"}; String SBT[] = new String[] {"Hora de las Islas Solomon", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "Hora de verano de Petropavlovsk-Kamchatski", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Hora de Nepal", "NPT", - "Hora de verano de Nepal", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Hora de Krasnoyarsk", "KRAT", "Hora de verano de Krasnoyarsk", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "Heure d'\u00e9t\u00e9 de Malaisie", "MYST"}; String NORONHA[] = new String[] {"Heure de Fernando de Noronha", "FNT", "Heure d'\u00e9t\u00e9 de Fernando de Noronha", "FNST"}; + String NPT[] = new String[] {"Heure du N\u00e9pal", "NPT", + "Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"}; String NST[] = new String[] {"Heure normale de Terre-Neuve", "NST", "Heure avanc\u00e9e de Terre-Neuve", "NDT"} ; String NZST[] = new String[] {"Heure normale de Nouvelle-Z\u00e9lande", "NZST", @@ -151,6 +153,8 @@ "Heure d'\u00e9t\u00e9 du Pakistan", "PKST"} ; String PST[] = new String[] {"Heure normale du Pacifique", "PST", "Heure avanc\u00e9e du Pacifique", "PDT"} ; + String RST[] = new String[] {"Heure normale de l'Est", "EST", + "Heure avanc\u00e9e du Centre", "CDT"} ; String SAST[] = new String[] {"Heure normale d'Afrique du Sud", "SAST", "Heure d'\u00e9t\u00e9 d'Afrique du Sud", "SAST"} ; String SBT[] = new String[] {"Heure des \u00celes Salomon", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "Heure d'\u00e9t\u00e9 de Petropavlovsk-Kamchatski", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Heure du N\u00e9pal", "NPT", - "Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Heure de Krasno\u00efarsk", "KRAT", "Heure d'\u00e9t\u00e9 de Krasno\u00efarsk", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "Ora estiva della Malaysia", "MYST"}; String NORONHA[] = new String[] {"Ora di Fernando de Noronha", "FNT", "Ora estiva di Fernando de Noronha", "FNST"}; + String NPT[] = new String[] {"Ora del Nepal", "NPT", + "Ora estiva del Nepal", "NPST"}; String NST[] = new String[] {"Ora solare di Terranova", "NST", "Ora legale di Terranova", "NDT"}; String NZST[] = new String[] {"Ora solare della Nuova Zelanda", "NZST", @@ -151,6 +153,8 @@ "Ora estiva del Pakistan", "PKST"}; String PST[] = new String[] {"Ora solare della costa occidentale USA", "PST", "Ora legale della costa occidentale USA", "PDT"}; + String RST[] = new String[] {"Ora solare USA orientale", "EST", + "Ora legale USA centrale", "CDT"}; String SAST[] = new String[] {"Ora solare del Sudafrica", "SAST", "Ora estiva del Sudafrica", "SAST"}; String SBT[] = new String[] {"Ora delle Isole Salomone", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "Ora estiva di Petropavlovsk-Kamchatski", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Ora del Nepal", "NPT", - "Ora estiva del Nepal", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Ora di Krasnojarsk", "KRAT", "Ora estiva di Krasnojarsk", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "\u30de\u30ec\u30fc\u30b7\u30a2\u590f\u6642\u9593", "MYST"}; String NORONHA[] = new String[] {"\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u6642\u9593", "FNT", "\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u590f\u6642\u9593", "FNST"}; + String NPT[] = new String[] {"\u30cd\u30d1\u30fc\u30eb\u6642\u9593", "NPT", + "\u30cd\u30d1\u30fc\u30eb\u590f\u6642\u9593", "NPST"}; String NST[] = new String[] {"\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u6a19\u6e96\u6642", "NST", "\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u590f\u6642\u9593", "NDT"}; String NZST[] = new String[] {"\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9\u6a19\u6e96\u6642", "NZST", @@ -151,6 +153,8 @@ "\u30d1\u30ad\u30b9\u30bf\u30f3\u590f\u6642\u9593", "PKST"}; String PST[] = new String[] {"\u592a\u5e73\u6d0b\u6a19\u6e96\u6642", "PST", "\u592a\u5e73\u6d0b\u590f\u6642\u9593", "PDT"}; + String RST[] = new String[] {"\u6771\u90e8\u6a19\u6e96\u6642", "EST", + "\u4e2d\u90e8\u590f\u6642\u9593", "CDT"}; String SAST[] = new String[] {"\u5357\u30a2\u30d5\u30ea\u30ab\u6a19\u6e96\u6642", "SAST", "\u5357\u30a2\u30d5\u30ea\u30ab\u590f\u6642\u9593", "SAST"}; String SBT[] = new String[] {"\u30bd\u30ed\u30e2\u30f3\u8af8\u5cf6\u6642\u9593", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "\u30da\u30c8\u30ed\u30d1\u30d6\u30ed\u30d5\u30b9\u30af\u30ab\u30e0\u30c1\u30e3\u30c4\u30ad\u30fc\u590f\u6642\u9593", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\u30cd\u30d1\u30fc\u30eb\u6642\u9593", "NPT", - "\u30cd\u30d1\u30fc\u30eb\u590f\u6642\u9593", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u6642\u9593", "KRAT", "\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u590f\u6642\u9593", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "\ub9d0\ub808\uc774\uc2dc\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha \uc2dc\uac04", "FNT", "Fernando de Noronha \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "FNST"}; + String NPT[] = new String[] {"\ub124\ud314 \uc2dc\uac04", "NPT", + "\ub124\ud314 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NPST"}; String NST[] = new String[] {"\ub274\ud380\ub4e4\ub79c\ub4dc \ud45c\uc900\uc2dc", "NST", "\ub274\ud380\ub4e4\ub79c\ub4dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NDT"}; String NZST[] = new String[] {"\ub274\uc9c8\ub79c\ub4dc \ud45c\uc900\uc2dc", "NZST", @@ -151,6 +153,8 @@ "\ud30c\ud0a4\uc2a4\ud0c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PKST"}; String PST[] = new String[] {"\ud0dc\ud3c9\uc591 \ud45c\uc900\uc2dc", "PST", "\ud0dc\ud3c9\uc591 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PDT"}; + String RST[] = new String[] {"\ub3d9\ubd80 \ud45c\uc900\uc2dc", "EST", + "\uc911\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"}; String SAST[] = new String[] {"\ub0a8\uc544\ud504\ub9ac\uce74 \ud45c\uc900\uc2dc", "SAST", "\ub0a8\uc544\ud504\ub9ac\uce74 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "SAST"}; String SBT[] = new String[] {"\uc194\ub85c\ubaac \uad70\ub3c4 \uc2dc\uac04", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "\ud398\ud2b8\ub85c\ud30c\ube14\ub85c\ud504\uc2a4\ud06c-\uce84\ucc28\uce20\ud0a4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\ub124\ud314 \uc2dc\uac04", "NPT", - "\ub124\ud314 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc2dc\uac04", "KRAT", "\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "Malaysia, sommartid", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha, normaltid", "FNT", "Fernando de Noronha, sommartid", "FNST"}; + String NPT[] = new String[] {"Nepal, normaltid", "NPT", + "Nepal, sommartid", "NPST"}; String NST[] = new String[] {"Newfoundland, normaltid", "NST", "Newfoundland, sommartid", "NDT"}; String NZST[] = new String[] {"Nya Zeeland, normaltid", "NZST", @@ -151,6 +153,8 @@ "Pakistan, sommartid", "PKST"}; String PST[] = new String[] {"Stilla havet, normaltid", "PST", "Stilla havet, sommartid", "PDT"}; + String RST[] = new String[] {"Eastern, normaltid", "EST", + "Central sommartid", "CDT"}; String SAST[] = new String[] {"Sydafrika, normaltid", "SAST", "Sydafrika, sommartid", "SAST"}; String SBT[] = new String[] {"Salomon\u00f6arna, normaltid", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "Petropavlovsk-Kamtjatka, sommartid", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Nepal, normaltid", "NPT", - "Nepal, sommartid", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Krasnojarsk, normaltid", "KRAT", "Krasnojarsk, sommartid", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "\u9a6c\u6765\u897f\u4e9a\u590f\u4ee4\u65f6", "MYST"}; String NORONHA[] = new String[] {"\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u65f6\u95f4", "FNT", "\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u590f\u4ee4\u65f6", "FNST"}; + String NPT[] = new String[] {"\u5c3c\u6cca\u5c14\u65f6\u95f4", "NPT", + "\u5c3c\u6cca\u5c14\u590f\u4ee4\u65f6", "NPST"}; String NST[] = new String[] {"\u7ebd\u82ac\u5170\u6807\u51c6\u65f6\u95f4", "NST", "\u7ebd\u82ac\u5170\u590f\u4ee4\u65f6", "NDT"}; String NZST[] = new String[] {"\u65b0\u897f\u5170\u6807\u51c6\u65f6\u95f4", "NZST", @@ -151,6 +153,8 @@ "\u5df4\u57fa\u65af\u5766\u590f\u4ee4\u65f6", "PKST"}; String PST[] = new String[] {"\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4", "PST", "\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6", "PDT"}; + String RST[] = new String[] {"\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4", "EST", + "\u4e2d\u592e\u590f\u4ee4\u65f6", "CDT"}; String SAST[] = new String[] {"\u5357\u975e\u6807\u51c6\u65f6\u95f4", "SAST", "\u5357\u975e\u590f\u4ee4\u65f6", "SAST"}; String SBT[] = new String[] {"\u6240\u7f57\u95e8\u7fa4\u5c9b\u65f6\u95f4", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "\u5f7c\u5f97\u7f57\u5df4\u752b\u6d1b\u592b\u65af\u514b\u590f\u4ee4\u65f6", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\u5c3c\u6cca\u5c14\u65f6\u95f4", "NPT", - "\u5c3c\u6cca\u5c14\u590f\u4ee4\u65f6", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u65f6\u95f4", "KRAT", "\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u590f\u4ee4\u65f6", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Thu Feb 05 09:24:45 2009 -0800 @@ -141,6 +141,8 @@ "\u99ac\u4f86\u897f\u4e9e\u590f\u4ee4\u6642\u9593", "MYST"}; String NORONHA[] = new String[] {"\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u6642\u9593", "FNT", "\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u590f\u4ee4\u6642\u9593", "FNST"}; + String NPT[] = new String[] {"\u5c3c\u6cca\u723e\u6642\u9593", "NPT", + "\u5c3c\u6cca\u723e\u590f\u4ee4\u6642\u9593", "NPST"}; String NST[] = new String[] {"\u7d10\u82ac\u862d\u6a19\u6e96\u6642\u9593", "NST", "\u7d10\u82ac\u862d\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "NDT"}; String NZST[] = new String[] {"\u7d10\u897f\u862d\u6a19\u6e96\u6642\u9593", "NZST", @@ -151,6 +153,8 @@ "\u5df4\u57fa\u65af\u5766\u590f\u4ee4\u6642\u9593", "PKST"}; String PST[] = new String[] {"\u592a\u5e73\u6d0b\u6a19\u6e96\u6642\u9593", "PST", "\u592a\u5e73\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "PDT"}; + String RST[] = new String[] {"\u6771\u65b9\u6a19\u6e96\u6642\u9593", "EST", + "\u4e2d\u592e\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"}; String SAST[] = new String[] {"\u5357\u975e\u6a19\u6e96\u6642\u9593", "SAST", "\u5357\u975e\u590f\u4ee4\u6642\u9593", "SAST"}; String SBT[] = new String[] {"\u6240\u7f85\u9580\u7fa4\u5cf6\u6642\u9593", "SBT", @@ -290,6 +294,7 @@ {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ "Petropavlovsk-Kamchatski \u590f\u4ee4\u6642\u9593", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\u5c3c\u6cca\u723e\u6642\u9593", "NPT", - "\u5c3c\u6cca\u723e\u590f\u4ee4\u6642\u9593", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u6642\u9593", "KRAT", "\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u590f\u4ee4\u6642\u9593", "KRAST"}}, diff -r d3de53b2070d -r 34c52e8a097b jdk/src/share/lib/audio/soundbank.gm Binary file jdk/src/share/lib/audio/soundbank.gm has changed diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/EventHandler/Test6788531.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/EventHandler/Test6788531.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,66 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6788531 + * @summary Tests public method lookup problem in EventHandler + * @author Sergey Malenkov + */ + +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.beans.EventHandler; + +public class Test6788531 { + public static void main(String[] args) throws Exception { + JButton button = new JButton("hi"); + button.addActionListener(EventHandler.create(ActionListener.class, new Private(), "run")); + button.addActionListener(EventHandler.create(ActionListener.class, new PrivateGeneric(), "run", "generic")); + button.doClick(); + } + + public static class Public { + public void run() { + throw new Error("method is overridden"); + } + } + + static class Private extends Public { + public void run() { + System.out.println("default"); + } + } + + public static class PublicGeneric { + public void run(T object) { + throw new Error("method is overridden"); + } + } + + static class PrivateGeneric extends PublicGeneric { + public void run(String string) { + System.out.println(string); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/PropertyEditor/TestEnumSubclass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclass.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,50 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for value of subtype Enum with security manager + * @author Sergey Malenkov + */ + +public class TestEnumSubclass { + public static void main(String[] args) { + System.setSecurityManager(new SecurityManager()); + new TestEditor(Operation.class); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/PropertyEditor/TestEnumSubclassJava.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassJava.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,49 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for value of subtype Enum + * @author Sergey Malenkov + */ + +public class TestEnumSubclassJava { + public static void main(String[] args) { + new TestEditor(Operation.class).testJava(Operation.PLUS); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/PropertyEditor/TestEnumSubclassNull.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassNull.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,49 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for null value of subtype Enum + * @author Sergey Malenkov + */ + +public class TestEnumSubclassNull { + public static void main(String[] args) { + new TestEditor(Operation.class).testJava(null); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/PropertyEditor/TestEnumSubclassValue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassValue.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,53 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for value of subtype Enum + * @author Sergey Malenkov + */ + +public class TestEnumSubclassValue { + public static void main(String[] args) { + TestEditor test = new TestEditor(Operation.class); + test.testValue(Operation.PLUS, "PLUS"); + test.testValue(null, null); + test.testText("MINUS", Operation.MINUS); + test.testText(null, null); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/Statement/Test6788531.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/Statement/Test6788531.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,62 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6788531 + * @summary Tests public method lookup problem in Statement + * @author Sergey Malenkov + */ + +import java.beans.Statement; + +public class Test6788531 { + public static void main(String[] args) throws Exception { + new Statement(new Private(), "run", null).execute(); + new Statement(new PrivateGeneric(), "run", new Object[] {"generic"}).execute(); + } + + public static class Public { + public void run() { + throw new Error("method is overridden"); + } + } + + static class Private extends Public { + public void run() { + System.out.println("default"); + } + } + + public static class PublicGeneric { + public void run(T object) { + throw new Error("method is overridden"); + } + } + + static class PrivateGeneric extends PublicGeneric { + public void run(String string) { + System.out.println(string); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/Test4864117.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/Test4864117.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,146 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4864117 + * @summary Tests XMLDecoder within another DefaultHandler for SAX parser + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import java.beans.ExceptionListener; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public final class Test4864117 extends DefaultHandler implements ExceptionListener { + private static final String TEST = "test"; + private static final String DATA + = "\n" + + " \n" + + " Hello, world!\n" + + " \n" + + ""; + + public static void main(String[] args) { + Test4864117 test = new Test4864117(); + InputStream input = new ByteArrayInputStream(DATA.getBytes()); + Exception error = null; + try { + SAXParserFactory.newInstance().newSAXParser().parse(input, test); + } + catch (ParserConfigurationException exception) { + error = exception; + } + catch (SAXException exception) { + error = exception.getException(); + if (error == null) { + error = exception; + } + } + catch (IOException exception) { + error = exception; + } + if (error != null) { + throw new Error("unexpected error", error); + } + test.print('?', test.getMessage()); + } + + private String message; + + public String getMessage() { + if (this.message == null) { + throw new Error("owner's method is not called"); + } + return this.message; + } + + public void setMessage(String message) { + this.message = message; + print(':', this.message); + } + + // DefaultHandler implementation + + private DefaultHandler handler; + private int depth; + + @Override + public void startDocument() throws SAXException { + this.handler = XMLDecoder.createHandler(this, this, null); + this.handler.startDocument(); + } + + @Override + public void endDocument() { + this.handler = null; + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + print('>', qName); + if (this.depth > 0) { + this.handler.startElement(uri, localName, qName, attributes); + } else if (!TEST.equals(qName)) { + throw new SAXException("unexpected element name: " + qName); + } + this.depth++; + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + this.depth--; + print('<', qName); + if (this.depth > 0) { + this.handler.endElement(uri, localName, qName); + } else if (!TEST.equals(qName)) { + throw new SAXException("unexpected element name: " + qName); + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + this.handler.characters(ch, start, length); + } + + public void exceptionThrown(Exception exception) { + throw new Error("unexpected exception", exception); + } + + private void print(char ch, String name) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < this.depth; i++) sb.append(' '); + sb.append(ch).append(' ').append(name); + System.out.println(sb.toString()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/Test6341798.java --- a/jdk/test/java/beans/XMLDecoder/Test6341798.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/test/java/beans/XMLDecoder/Test6341798.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ private static final String DATA = "\n" - + " \n" + + " \n" + " \n" + " true\n" + " \n" diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/AbstractTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/AbstractTest.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.beans.ExceptionListener; +import java.beans.XMLDecoder; + +import java.io.ByteArrayInputStream; + +abstract class AbstractTest implements ExceptionListener { + public void exceptionThrown(Exception exception) { + throw new Error("unexpected exception", exception); + } + + /** + * Validates the XML decoder for XML archive + * that defined in the public field of the subclass. + * + * @param decoder the initialized XML decoder + * @throws Error if validation failed + */ + protected abstract void validate(XMLDecoder decoder); + + /** + * This is entry point to start testing. + * + * @param security use {@code true} to start + * second pass in secure context + */ + final void test(boolean security) { + byte[] array = getFieldValue("XML").getBytes(); // NON-NLS: the field name + ByteArrayInputStream input = new ByteArrayInputStream(array); + XMLDecoder decoder = new XMLDecoder(input); + decoder.setExceptionListener(this); + validate(decoder); + try { + throw new Error("unexpected object" + decoder.readObject()); + } catch (ArrayIndexOutOfBoundsException exception) { + // expected exception + } + decoder.close(); + if (security) { + System.setSecurityManager(new SecurityManager()); + test(false); + } + } + + private String getFieldValue(String field) { + try { + return getClass().getField(field).get(this).toString(); + } catch (NoSuchFieldException exception) { + throw new Error("unexpected exception", exception); + } catch (IllegalAccessException exception) { + throw new Error("unexpected exception", exception); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestArray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestArray.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,86 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import java.lang.reflect.Array; + +public final class TestArray extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " -111\n" + + " 1111\n" + + " \n" + + " \n" + + " \n" + + " Hello, world!\n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestArray().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + Number[] numbers = getArray(Number.class, 2, decoder.readObject()); + if (!numbers[0].equals(Byte.valueOf("-111"))) { // NON-NLS: hardcoded in XML + throw new Error("unexpected byte value"); + } + if (!numbers[1].equals(Long.valueOf("1111"))) { // NON-NLS: hardcoded in XML + throw new Error("unexpected long value"); + } + + Object[] objects = getArray(Object.class, 3, decoder.readObject()); + if (objects[0] != null) { + throw new Error("unexpected first value"); + } + if (!objects[1].equals("Hello, world!")) { // NON-NLS: hardcoded in XML + throw new Error("unexpected string value"); + } + if (objects[2] != null) { + throw new Error("unexpected last value"); + } + } + + private static T[] getArray(Class component, int length, Object object) { + Class type = object.getClass(); + if (!type.isArray()) { + throw new Error("array expected"); + } + if (!type.getComponentType().equals(component)) { + throw new Error("unexpected component type"); + } + if (length != Array.getLength(object)) { + throw new Error("unexpected array length"); + } + return (T[]) object; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestBoolean.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestBoolean.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,52 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestBoolean extends AbstractTest { + public static final String XML + = "\n" + + " true\n" + + " false\n" + + ""; + + public static void main(String[] args) { + new TestBoolean().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!Boolean.TRUE.equals(decoder.readObject())) { + throw new Error("true expected"); + } + if (!Boolean.FALSE.equals(decoder.readObject())) { + throw new Error("false expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestByte.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestByte.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestByte extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + ""; + + public static void main(String[] args) { + new TestByte().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate((byte) 0, decoder.readObject()); + validate(Byte.MAX_VALUE, decoder.readObject()); + validate(Byte.MIN_VALUE, decoder.readObject()); + } + + private static void validate(byte value, Object object) { + if (!object.equals(Byte.valueOf(value))) { + throw new Error("byte " + value + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestChar.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestChar.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,52 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestChar extends AbstractTest { + public static final String XML + = "\n" + + " X\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestChar().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!decoder.readObject().equals(Character.valueOf('X'))) { + throw new Error("unexpected character"); + } + if (!decoder.readObject().equals(Character.valueOf((char) 0x20))) { + throw new Error("unexpected character code"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestClass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestClass.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,61 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestClass extends AbstractTest { + public static final String PREFIX = "javax.swing.colorchooser."; + public static final String INTERFACE = "ColorSelectionModel"; + public static final String PUBLIC_CLASS = "DefaultColorSelectionModel"; + public static final String PRIVATE_CLASS = "DiagramComponent"; + public static final String XML + = "\n" + + " " + PREFIX + INTERFACE + "\n" + + " " + PREFIX + PUBLIC_CLASS + "\n" + + " " + PREFIX + PRIVATE_CLASS + "\n" + + ""; + + public static void main(String[] args) { + new TestClass().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(PREFIX + INTERFACE, decoder.readObject()); + validate(PREFIX + PUBLIC_CLASS, decoder.readObject()); + validate(PREFIX + PRIVATE_CLASS, decoder.readObject()); + } + + private static void validate(String name, Object object) { + Class type = (Class) object; + if (!type.getName().equals(name)) { + throw new Error(name + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestDouble.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestDouble.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestDouble extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 1000\n" + + " -1.1e15\n" + + " 10.11e-123\n" + + ""; + + public static void main(String[] args) { + new TestDouble().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0.0, decoder.readObject()); + validate(1000.0, decoder.readObject()); + validate(-1.1e15, decoder.readObject()); + validate(10.11e-123, decoder.readObject()); + } + + private static void validate(double value, Object object) { + if (!object.equals(Double.valueOf(value))) { + throw new Error("double " + value + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestFalse.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestFalse.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestFalse extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestFalse().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!Boolean.FALSE.equals(decoder.readObject())) { + throw new Error("false expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestField.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestField.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,74 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestField extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " static postfix\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " postfix\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestField().test(true); + } + + public static String FIELD; + public String field; + + @Override + protected void validate(XMLDecoder decoder) { + FIELD = "static prefix"; + field = "prefix"; + decoder.setOwner(this); + validate(decoder, "static prefix"); + validate(decoder, "static postfix"); + validate(decoder, "prefix"); + validate(decoder, "postfix"); + } + + private static void validate(XMLDecoder decoder, String name) { + if (!decoder.readObject().equals(name)) { + throw new Error(name + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestFloat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestFloat.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestFloat extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 100\n" + + " -1e15\n" + + " 100e-20\n" + + ""; + + public static void main(String[] args) { + new TestFloat().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0.0f, decoder.readObject()); + validate(100.0f, decoder.readObject()); + validate(-1e15f, decoder.readObject()); + validate(100e-20f, decoder.readObject()); + } + + private static void validate(float value, Object object) { + if (!object.equals(Float.valueOf(value))) { + throw new Error("float " + value + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestInt extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + " 32767\n" + + " -32768\n" + + " 2147483647\n" + + " -2147483648\n" + + ""; + + public static void main(String[] args) { + new TestInt().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0, decoder.readObject()); + validate((int) Byte.MAX_VALUE, decoder.readObject()); + validate((int) Byte.MIN_VALUE, decoder.readObject()); + validate((int) Short.MAX_VALUE, decoder.readObject()); + validate((int) Short.MIN_VALUE, decoder.readObject()); + validate(Integer.MAX_VALUE, decoder.readObject()); + validate(Integer.MIN_VALUE, decoder.readObject()); + } + + private static void validate(int value, Object object) { + if (!object.equals(Integer.valueOf(value))) { + throw new Error("int " + value + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestJava.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestJava.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestJava extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " Hello, world!\n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestJava().test(true); + } + + private String message; + + public void init(String message) { + this.message = message; + } + + @Override + protected void validate(XMLDecoder decoder) { + decoder.setOwner(this); + if (this != decoder.readObject()) { + throw new Error("owner should be the same"); + } + if (this.message == null) { + throw new Error("owner's method is not called"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestLong.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestLong.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestLong extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + " 32767\n" + + " -32768\n" + + " 2147483647\n" + + " -2147483648\n" + + " 9223372036854775807\n" + + " -9223372036854775808\n" + + ""; + + public static void main(String[] args) { + new TestLong().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0L, decoder.readObject()); + validate((long) Byte.MAX_VALUE, decoder.readObject()); + validate((long) Byte.MIN_VALUE, decoder.readObject()); + validate((long) Short.MAX_VALUE, decoder.readObject()); + validate((long) Short.MIN_VALUE, decoder.readObject()); + validate((long) Integer.MAX_VALUE, decoder.readObject()); + validate((long) Integer.MIN_VALUE, decoder.readObject()); + validate(Long.MAX_VALUE, decoder.readObject()); + validate(Long.MIN_VALUE, decoder.readObject()); + } + + private static void validate(long value, Object object) { + if (!object.equals(Long.valueOf(value))) { + throw new Error("long " + value + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestMethod.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestMethod.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,178 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestMethod extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestMethod().test(true); + } + + private NoSuchMethodException exception; + + @Override + public void exceptionThrown(Exception exception) { + if (this.exception != null) { + // only one exception allowed + super.exceptionThrown(exception); + } else if (exception instanceof NoSuchMethodException) { + // expected exception: ambiguous methods are found + this.exception = (NoSuchMethodException) exception; + } else { + super.exceptionThrown(exception); + } + } + + @Override + protected void validate(XMLDecoder decoder) { + this.exception = null; + validate(decoder, A.class); + validate(decoder, B.class); + validate(decoder, C.class); + validate(decoder, D.class); + validate(decoder, E.class); + if (this.exception == null) { + throw new Error("NoSuchMethodException expected"); + } + } + + private static void validate(XMLDecoder decoder, Class type) { + if (!type.equals(decoder.readObject().getClass())) { + throw new Error("unexpected class"); + } + } + + /** + * All ambiguous method declarations should fail. + */ + public static class A { + public void m(X x1, X x2) { + throw new Error("A.m(X,X) should not be called"); + } + + public void m(X x1, Y y2) { + throw new Error("A.m(X,Y) should not be called"); + } + + public void m(Y y1, X x2) { + throw new Error("A.m(Y,X) should not be called"); + } + } + + /** + * The most specific method in this case would be the second declaration. + */ + public static class B { + public void m(X x1, X x2) { + throw new Error("B.m(X,X) should not be called"); + } + + public void m(X x1, Y y2) { + // expected: B.m(X,Y) should be called + } + } + + /** + * The most specific method in this case would be the first declaration. + */ + public static class C { + public void m(Y y1, Y y2) { + // expected: C.m(Y,Y) should be called + } + + public void m(X x1, X x2) { + throw new Error("C.m(X,X) should not be called"); + } + } + + /** + * Same as the previous case but flip methods. + */ + public static class D { + public void m(X x1, X x2) { + throw new Error("D.m(X,X) should not be called"); + } + + public void m(Y y1, Y y2) { + // expected: D.m(Y,Y) should be called + } + } + + /** + * The method should be called with (Z,Z). + */ + public static class E { + public void m(X x1, X x2) { + // expected: E.m(X,X) should be called + } + } + + public static class X { + } + + public static class Y extends X { + } + + public static class Z extends Y { + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestNew.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestNew.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,90 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import java.util.ArrayList; +import java.util.List; + +public final class TestNew extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " single\n" + + " \n" + + " \n" + + " first\n" + + " second\n" + + " third\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestNew().test(true); + } + + private List list; + + public TestNew(String...messages) { + if (messages != null) { + this.list = new ArrayList(); + for (String message : messages) { + this.list.add(message); + } + } + } + + @Override + public boolean equals(Object object) { + if (object instanceof TestNew) { + TestNew test = (TestNew) object; + return (test.list == null) + ? this.list == null + : test.list.equals(this.list); + } + return false; + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(decoder.readObject()); + validate(decoder.readObject(), null); + validate(decoder.readObject(), "single"); + validate(decoder.readObject(), "first", "second", "third"); + } + + private static void validate(Object object, String...messages) { + if (!object.equals(new TestNew(messages))) { + throw new Error("expected object"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestNull.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestNull.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestNull extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestNull().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (null != decoder.readObject()) { + throw new Error("null value expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestObject.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,84 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +public final class TestObject extends AbstractTest { + public static final String XML // TODO + = "\n" + + " \n" + + " \n" + + " \n" + + " button\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " label\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestObject().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + JPanel panel = (JPanel) decoder.readObject(); + if (2 != panel.getComponents().length) { + throw new Error("unexpected component count"); + } + JButton button = (JButton) panel.getComponents()[0]; + if (!button.getText().equals("button")) { // NON-NLS: hardcoded in XML + throw new Error("unexpected button text"); + } + if (SwingConstants.CENTER != button.getVerticalAlignment()) { + throw new Error("unexpected vertical alignment"); + } + JLabel label = (JLabel) panel.getComponents()[1]; + if (!label.getText().equals("label")) { // NON-NLS: hardcoded in XML + throw new Error("unexpected label text"); + } + if (button != label.getLabelFor()) { + throw new Error("unexpected component"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestProperty.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestProperty.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,88 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestProperty extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " message\n" + + " \n" + + " \n" + + " \n" + + " indexed\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestProperty().test(true); + } + + private int index; + private String message; + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getIndexed(int index) { + if (this.index != index) { + throw new Error("unexpected index"); + } + return this.message; + } + + public void setIndexed(int index, String message) { + this.index = index; + this.message = message; + } + + @Override + protected void validate(XMLDecoder decoder) { + decoder.setOwner(this); + validate(decoder, "message"); + validate(decoder, "indexed"); + } + + private static void validate(XMLDecoder decoder, String name) { + if (!decoder.readObject().equals(name)) { + throw new Error(name + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestShort.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestShort.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestShort extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + " 32767\n" + + " -32768\n" + + ""; + + public static void main(String[] args) { + new TestShort().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate((short) 0, decoder.readObject()); + validate((short) Byte.MAX_VALUE, decoder.readObject()); + validate((short) Byte.MIN_VALUE, decoder.readObject()); + validate(Short.MAX_VALUE, decoder.readObject()); + validate(Short.MIN_VALUE, decoder.readObject()); + } + + private static void validate(short value, Object object) { + if (!object.equals(Short.valueOf(value))) { + throw new Error("short " + value + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestString.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestString.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestString extends AbstractTest { + public static final String PREFIX = " prefix "; + public static final String POSTFIX = " postfix "; + public static final String XML + = "\n" + + " " + PREFIX + "\n" + + " " + POSTFIX + "\n" + + " " + PREFIX + POSTFIX + "\n" + + " " + PREFIX + "" + POSTFIX + "\n" + + ""; + + public static void main(String[] args) { + new TestString().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(PREFIX, decoder.readObject()); + validate(POSTFIX, decoder.readObject()); + validate(PREFIX + POSTFIX, decoder.readObject()); + validate(PREFIX + '\u0000' + POSTFIX, decoder.readObject()); + } + + private static void validate(String name, Object object) { + if (!object.equals(name)) { + throw new Error(name + " expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestTrue.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestTrue.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestTrue extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestTrue().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!Boolean.TRUE.equals(decoder.readObject())) { + throw new Error("true expected"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/beans/XMLDecoder/spec/TestVar.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLDecoder/spec/TestVar.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestVar extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestVar().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + for (int i = 0; i < 3; i++) { + if (decoder != decoder.readObject()) { + throw new Error("decoder instance expected"); + } + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/text/Bidi/BidiBug.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/text/Bidi/BidiBug.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4827312 + * @summary verify that argument validity check is not fooled by overflow + */ +public class BidiBug { + public static void main(String[] args) { + try { + byte buff[] = new byte[3000]; + java.text.Bidi bidi = new java.text.Bidi(new char[20],10,buff,Integer.MAX_VALUE-3,4,1); + } + catch (IllegalArgumentException e) { + System.out.println(e); + return; // success + } + throw new RuntimeException("didn't throw error, though we didn't crash either"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/text/Bidi/BidiEmbeddingTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/text/Bidi/BidiEmbeddingTest.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4396492 4396496 4778510 + * @summary verify that the embedding values processed by the bidi code use negative values to + * indicate overrides, rather than using bit 7. Also tests Bidi without loading awt classes to + * confirm that Bidi can be used without awt. Verify that embedding level 0 is properly mapped + * to the base embedding level. + */ + +import java.awt.Color; +import java.awt.Frame; +import java.awt.font.TextAttribute; +import java.text.AttributedString; +import java.text.Bidi; + +public class BidiEmbeddingTest { + public static void main(String[] args) { + // to regress embedding test against old fix, call with an arg. A window will pop + // up causing awt lib to be loaded so the vm won't die with the unsatisfied link error. + if (args.length > 0) { + Frame f = new Frame(); + f.setSize(300, 300); + f.setBackground(Color.white); + f.show(); + } + + test1(); + test2(); + } + + static void test1() { + String target = "BACK WARDS"; + String str = "If this text is >" + target + "< the test passed."; + int start = str.indexOf(target); + int limit = start + target.length(); + + System.out.println("start: " + start + " limit: " + limit); + + AttributedString astr = new AttributedString(str); + astr.addAttribute(TextAttribute.BIDI_EMBEDDING, + new Integer(-1), + start, + limit); + + Bidi bidi = new Bidi(astr.getIterator()); + + for (int i = 0; i < bidi.getRunCount(); ++i) { + System.out.println("run " + i + + " from " + bidi.getRunStart(i) + + " to " + bidi.getRunLimit(i) + + " at level " + bidi.getRunLevel(i)); + } + + System.out.println(bidi); + + byte[] embs = new byte[str.length() + 3]; + for (int i = start + 1; i < limit + 1; ++i) { + embs[i] = -1; + } + + Bidi bidi2 = new Bidi(str.toCharArray(), 0, embs, 1, str.length(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); + for (int i = 0; i < bidi2.getRunCount(); ++i) { + System.out.println("run " + i + + " from " + bidi2.getRunStart(i) + + " to " + bidi2.getRunLimit(i) + + " at level " + bidi2.getRunLevel(i)); + } + + System.out.println(bidi2); + + if (bidi.getRunCount() != 3 || bidi2.getRunCount() != 3) { + throw new Error("Bidi run count incorrect"); + } + } + + // make sure BIDI_EMBEDDING values of 0 are mapped to base run direction, instead of flagging an error. + static void test2() { + String target = "BACK WARDS"; + String str = "If this text is >" + target + "< the test passed."; + int length = str.length(); + int start = str.indexOf(target); + int limit = start + target.length(); + + System.out.println("start: " + start + " limit: " + limit); + + AttributedString astr = new AttributedString(str); + astr.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL); + + astr.addAttribute(TextAttribute.BIDI_EMBEDDING, + new Integer(-3), + start, + limit); + + Bidi bidi = new Bidi(astr.getIterator()); + + for (int i = 0; i < bidi.getRunCount(); ++i) { + System.out.println("run " + i + + " from " + bidi.getRunStart(i) + + " to " + bidi.getRunLimit(i) + + " at level " + bidi.getRunLevel(i)); + } + + System.out.println(bidi); + + if (bidi.getRunCount() != 6) { // runs of spaces and angles at embedding bound,s and final period, each get level 1 + throw new Error("Bidi embedding processing failed"); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/text/Bidi/BidiSurrogateTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/text/Bidi/BidiSurrogateTest.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4888843 + * @summary verify that surrogate pairs representing codepoints with R or AL directionality + * and correctly recognized and reordered. + */ + +import java.text.Bidi; + +public class BidiSurrogateTest { + private static final String RTLS = new String(Character.toChars(0x10800)); // surrogate code point with R directionality + private static final String LTRS = new String(Character.toChars(0x107ff)); // surrogate code point with L directionality + private static final String LRE = "\u202a"; + private static final String RLE = "\u202b"; + private static final String PDF = "\u202c"; + + + public static void main(String[] args) { + new BidiSurrogateTest().test(); + } + + void test() { + test0(); + test1(); + } + + void test0() { + // test unpaired surrogates - should have L directionality + testRequiresBidi("\ud800", false); // unpaired lead surrogate + testRequiresBidi("\udc00", false); // unpaired trail surrogate + testRequiresBidi("\udc00\ud800", false); // out of order surrogates + testRequiresBidi("a\udc00b\ud800c", false); // out of order surrogates split + testRequiresBidi(LTRS, false); // supplementary with L + testRequiresBidi(RTLS, true); // supplementary with R + testRequiresBidi("a" + RTLS + "b", true); // R supplementary in LTR text + testRequiresBidi(LTRS + RTLS, true); // R supplementary in LTR supplementary text + testRequiresBidi(LRE, false); // LRE lone embedding + testRequiresBidi(RLE, true); // RLE lone embedding + testRequiresBidi(PDF, false); // PDF lone pop embedding + } + + void testRequiresBidi(String string, boolean requiresBidi) { + char[] text = string.toCharArray(); + if (Bidi.requiresBidi(text, 0, text.length) != requiresBidi) { + throw new RuntimeException("testRequiresBidi failed with '" + string + "', " + requiresBidi); + } + } + + void test1() { + // test that strings with surrogate runs process surrogate directionality ok + testBidi("This is a string with " + LTRS + " in it.", false); + testBidi("This is a string with \ud800 in it.", false); + testBidi("This is a string with \u0640 in it.", 22, 1); + testBidi(RTLS, true); + testBidi("This is a string with " + RTLS + RTLS + RTLS + " in it.", 22, 6); + } + + void testBidi(String string, boolean directionIsRTL) { + Bidi bidi = new Bidi(string, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); + if (bidi.isMixed()) { + throw new RuntimeException("bidi is mixed"); + } + if (bidi.isRightToLeft() != directionIsRTL) { + throw new RuntimeException("bidi is not " + (directionIsRTL ? "rtl" : "ltr")); + } + } + + void testBidi(String string, int rtlstart, int rtllength) { + Bidi bidi = new Bidi(string, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); + for (int i = 0; i < bidi.getRunCount(); ++i) { + if ((bidi.getRunLevel(i) & 1) != 0) { + if (bidi.getRunStart(i) != rtlstart || + bidi.getRunLimit(i) != rtlstart + rtllength) { + throw new RuntimeException("first rtl run didn't match " + rtlstart + ", " + rtllength); + } + break; + } + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/text/Format/DateFormat/Bug4823811.java --- a/jdk/test/java/text/Format/DateFormat/Bug4823811.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/test/java/text/Format/DateFormat/Bug4823811.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,6 +25,7 @@ * @test * @bug 4823811 * @summary Confirm that text which includes numbers with a trailing minus sign is parsed correctly. + * @run main/othervm -Duser.timezone=GMT+09:00 Bug4823811 */ import java.text.*; diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/text/Format/DateFormat/Bug6683975.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/text/Format/DateFormat/Bug6683975.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,114 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6683975 + * @summary Make sure that date is formatted correctlyin th locale. + */ +import java.text.*; +import java.util.*; + +public class Bug6683975 { + + private static boolean err = false; + + private static Locale th = new Locale("th", ""); + private static Locale th_TH = new Locale("th", "TH"); + private static String expected_th[] = { + "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e17\u0e35\u0e48 30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e04.\u0e28. 2008, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35 00 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35", // 0: FULL + "30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 2008, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35", // 1: LONG + "30 \u0e01.\u0e22. 2008, 8:00:00", // 2: MEDIUM + "30/9/2008, 8:00 \u0e19.", // 3: SHORT + }; + private static String expected_th_TH[] = { + "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e17\u0e35\u0e48 30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e1e.\u0e28. 2551, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35 00 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35", // 0: FULL + "30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 2551, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35", // 1: LONG + "30 \u0e01.\u0e22. 2551, 8:00:00", // 2: MEDIUM + "30/9/2551, 8:00 \u0e19." // 3: SHORT + }; + private static String stylePattern[] = { + "FULL", "LONG", "MEDIUM", "SHORT" + }; + + private static void test(int style) { + DateFormat df_th = DateFormat.getDateTimeInstance(style, style, th); + DateFormat df_th_TH = DateFormat.getDateTimeInstance(style, style, th_TH); + + String str_th = ((SimpleDateFormat)df_th).toPattern(); + String str_th_TH = ((SimpleDateFormat)df_th_TH).toPattern(); + if (!str_th.equals(str_th_TH)) { + err = true; + System.err.println("Error: Pattern for th locale should be the same as pattern for th_TH locale. (" + stylePattern[style] + ")"); + System.err.println("\tth: " + str_th); + System.err.println("\tth_TH: " + str_th_TH); + } + + Date date = new Date(2008-1900, Calendar.SEPTEMBER, 30, 8, 0, 0); + str_th = df_th.format(date); + if (!expected_th[style].equals(str_th)) { + err = true; + System.err.println("Error: Formatted date in th locale is incorrect in " + stylePattern[style] + " pattern."); + System.err.println("\tExpected: " + expected_th[style]); + System.err.println("\tGot: " + str_th); + } + + str_th_TH = df_th_TH.format(date); + if (!expected_th_TH[style].equals(str_th_TH)) { + err = true; + System.err.println("Error: Formatted date in th_TH locale is incorrect in " + stylePattern[style] + " pattern."); + System.err.println("\tExpected: " + expected_th_TH[style]); + System.err.println("\tGot: " + str_th_TH); + } + } + + public static void main(String[] args) { + TimeZone timezone = TimeZone.getDefault(); + Locale locale = Locale.getDefault(); + + TimeZone.setDefault(TimeZone.getTimeZone("US/Pacific")); + Locale.setDefault(Locale.US); + + try { + test(DateFormat.FULL); + test(DateFormat.LONG); + test(DateFormat.MEDIUM); + test(DateFormat.SHORT); + } + catch (Exception e) { + err = true; + System.err.println("Unexpected exception was thrown: " + e); + } + finally { + TimeZone.setDefault(timezone); + Locale.setDefault(locale); + + if (err) { + throw new RuntimeException("Failed."); + } else { + System.out.println("Passed."); + } + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/util/Calendar/Bug6645263.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Calendar/Bug6645263.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +/* + * @test + * @bug 6645263 + * @summary Test field normalization in non-lenient from the partially normalized state + */ + +import java.util.*; + +public class Bug6645263 { + public static void main(String[] args) { + Calendar cal = new GregorianCalendar(Locale.US); + cal.setLenient(false); + cal.set(Calendar.YEAR, 2007); + cal.set(Calendar.MONTH, Calendar.NOVEMBER); + cal.set(Calendar.WEEK_OF_MONTH, 4); + cal.set(Calendar.DAY_OF_WEEK, 1); + // Let cal calculate the time from the given fields + cal.getTime(); + + // Change DAY_OF_MONTH + cal.set(Calendar.DAY_OF_MONTH, 1); + // The following line shouldn't throw an IllegalArgumentException. + cal.getTime(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/util/Currency/ValidateISO4217.java --- a/jdk/test/java/util/Currency/ValidateISO4217.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/test/java/util/Currency/ValidateISO4217.java Thu Feb 05 09:24:45 2009 -0800 @@ -22,7 +22,7 @@ */ /* * @test - * @bug 4691089 4819436 4942982 5104960 6544471 + * @bug 4691089 4819436 4942982 5104960 6544471 6627549 * @summary Validate ISO 4217 data for Currency class. */ @@ -86,6 +86,8 @@ {"JE", "GBP", "826", "2"}, // Jersey {"GG", "GBP", "826", "2"}, // Guernsey {"IM", "GBP", "826", "2"}, // Isle of Man + {"BL", "EUR", "978", "2"}, // Saint Barthelemy + {"MF", "EUR", "978", "2"}, // Saint Martin }; /* Codes that are obsolete, do not have related country */ diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/util/Locale/LocaleTest.java --- a/jdk/test/java/util/Locale/LocaleTest.java Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/test/java/util/Locale/LocaleTest.java Thu Feb 05 09:24:45 2009 -0800 @@ -24,7 +24,7 @@ * @test * @bug 4052404 4052440 4084688 4092475 4101316 4105828 4107014 4107953 4110613 * 4118587 4118595 4122371 4126371 4126880 4135316 4135752 4139504 4139940 4143951 - * 4147315 4147317 4147552 4335196 4778440 5010672 6475525 6544471 + * 4147315 4147317 4147552 4335196 4778440 5010672 6475525 6544471 6627549 6786276 * @summary test Locales */ /* @@ -439,8 +439,8 @@ String[] spotCheck2 = { "US", "CA", "GB", "FR", "DE", "IT", "JP", "KR", "CN", "TW", "TH" }; - if (test.length != 245) - errln("Expected getISOCountries to return 245 countries; it returned " + test.length); + if (test.length != 246) + errln("Expected getISOCountries to return 246 countries; it returned " + test.length); else { for (int i = 0; i < spotCheck2.length; i++) { int j; diff -r d3de53b2070d -r 34c52e8a097b jdk/test/java/util/Locale/data/deflocale.sol10 --- a/jdk/test/java/util/Locale/data/deflocale.sol10 Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/test/java/util/Locale/data/deflocale.sol10 Thu Feb 05 09:24:45 2009 -0800 @@ -1,7 +1,7 @@ Solaris 10 3/05 s10_74L2a SPARC - Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. - Use is subject to license terms. - Assembled 22 January 2005 + + (copyright from `uname -a` goes here) + SunOS deltas4 5.10 Generic_118833-03 sun4u sparc SUNW,Sun-Blade-2500 OS Locale: C diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/GetFormat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/GetFormat.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatConverter getFormat method */ + +import javax.sound.sampled.*; +import com.sun.media.sound.*; + +public class GetFormat { + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 16, 1, true, false); + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + if(!conv.getFormat().matches(frm)) + throw new RuntimeException("Incorrect audio format returned."); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/ToFloatArray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/ToFloatArray.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,160 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatConverter toFloatArray method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ToFloatArray { + + public static void main(String[] args) throws Exception { + float[] testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + + // Check conversion using PCM_FLOAT + for (int big = 0; big < 2; big+=1) + for (int bits = 32; bits <= 64; bits+=32) { + AudioFormat frm = new AudioFormat( + AudioFloatConverter.PCM_FLOAT, + 44100, bits, 1, bits/8, + 44100, big==1); + byte[] buff = new byte[testarray.length * frm.getFrameSize()]; + float[] testarray2 = new float[testarray.length]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, buff); + conv.toFloatArray(buff, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + throw new RuntimeException("Conversion failed for " + frm +" , arrays not equal enough!\n"); + } + } + + // Check conversion from float2byte and byte2float. + for (int big = 0; big < 2; big+=1) + for (int signed = 0; signed < 2; signed+=1) + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm = new AudioFormat(44100, bits, 1, signed==1, big==1); + byte[] buff = new byte[testarray.length * frm.getFrameSize()]; + float[] testarray2 = new float[testarray.length]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, buff); + conv.toFloatArray(buff, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + throw new RuntimeException("Conversion failed for " + frm +" , arrays not equal enough!\n"); + } + } + + // Check big/little + for (int big = 0; big < 2; big+=1) + for (int signed = 0; signed < 2; signed+=1) + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm = new AudioFormat(44100, bits, 1, signed==1, big==1); + byte[] buff = new byte[testarray.length * frm.getFrameSize()]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, buff); + byte[] buff2 = new byte[testarray.length * frm.getFrameSize()]; + int fs = frm.getFrameSize(); + for (int i = 0; i < buff2.length; i+=fs) { + for (int j = 0; j < fs; j++) { + buff2[i+(fs-j-1)] = buff[i+j]; + } + } + float[] testarray2 = new float[testarray.length]; + AudioFormat frm2 = new AudioFormat(44100, bits, 1, signed==1, big==0); + AudioFloatConverter.getConverter(frm2).toFloatArray(buff2, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + { + throw new RuntimeException("Conversion failed for " + frm +" to " + frm2 + " , arrays not equal enough!\n"); + } + } + } + + // Check signed/unsigned + for (int big = 0; big < 2; big+=1) + for (int signed = 0; signed < 2; signed+=1) + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm = new AudioFormat(44100, bits, 1, signed==1, big==1); + byte[] b = new byte[testarray.length * frm.getFrameSize()]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, b); + int fs = frm.getFrameSize(); + if(big==1) + { + for(int i=0; i < b.length; i+= fs ) + b[i] = (b[i] >= 0) ? (byte)(0x80 | b[i]) : (byte)(0x7F & b[i]); + } + else + { + for(int i=(0+fs-1); i < b.length; i+= fs ) + b[i] = (b[i] >= 0) ? (byte)(0x80 | b[i]) : (byte)(0x7F & b[i]); + } + float[] testarray2 = new float[testarray.length]; + AudioFormat frm2 = new AudioFormat(44100, bits, 1, signed==0, big==1); + AudioFloatConverter.getConverter(frm2).toFloatArray(b, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + { + throw new RuntimeException("Conversion failed for " + frm +" to " + frm2 + " , arrays not equal enough!\n"); + } + } + } + + // Check if conversion 32->24, 24->16, 16->8 result in same float data + AudioFormat frm = new AudioFormat(44100, 40, 1, true, true); + byte[] b = new byte[testarray.length * frm.getFrameSize()]; + AudioFloatConverter.getConverter(frm).toByteArray(testarray, b); + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm2 = new AudioFormat(44100, bits, 1, true, true); + byte[] b2 = new byte[testarray.length * frm2.getFrameSize()]; + int fs1 = frm.getFrameSize(); + int fs2 = frm2.getFrameSize(); + int ii = 0; + for (int i = 0; i < b.length; i+=fs1) + for (int j = 0; j < fs2; j++) + b2[ii++] = b[i+j]; + float[] testarray2 = new float[testarray.length]; + AudioFloatConverter.getConverter(frm2).toFloatArray(b2, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + { + throw new RuntimeException("Conversion failed for " + frm +" to " + frm2 + " , arrays not equal enough!\n"); + } + } + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Available.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Available.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream available method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Available { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[512]; + if(stream.available() != 1024) + throw new RuntimeException("stream.available return incorrect value."); + stream.read(buff); + if(stream.available() != 512) + throw new RuntimeException("stream.available return incorrect value."); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Close.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Close.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream close method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + getStream1().close(); + getStream2().close(); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFormat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFormat.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream getFormat method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFormat { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + if(!getStream1().getFormat().matches(format)) + throw new RuntimeException("Incorrect audio format returned."); + if(!getStream2().getFormat().matches(format)) + throw new RuntimeException("Incorrect audio format returned."); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFrameLength.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFrameLength.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream getFrameLength method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFrameLength { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + if(getStream1().getFrameLength() != 1024L) + throw new RuntimeException("Incorrect frame length returned."); + if(getStream2().getFrameLength() != 1024L) + throw new RuntimeException("Incorrect frame length returned."); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/MarkSupported.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/MarkSupported.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream markSupported method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class MarkSupported { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + if(!getStream1().markSupported()) + throw new RuntimeException("Mark not supported."); + if(!getStream2().markSupported()) + throw new RuntimeException("Mark not supported."); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Read.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Read.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream read method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Read { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float v = 0; + stream.skip(512); + v = stream.read(); + if(!(Math.abs(v - test_float_array[512]) < 0.0001)) + { + throw new RuntimeException("Read returned unexpected value."); + } + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArray.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream read(float[]) method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadFloatArray { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[1024]; + stream.read(buff); + for (int j = 0; j < buff.length; j++) + if(!(Math.abs(buff[j] - test_float_array[j]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArrayIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArrayIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream read(float[], int, int) method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadFloatArrayIntInt { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[1024]; + stream.read(buff,0,512); + stream.read(buff,512,512); + for (int j = 0; j < buff.length; j++) + if(!(Math.abs(buff[j] - test_float_array[j]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Reset.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Reset.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,87 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream reset method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Reset { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[512]; + float[] buff2 = new float[512]; + stream.read(buff); + stream.mark(512); + stream.read(buff); + stream.reset(); + stream.read(buff2); + for (int j = 0; j < buff2.length; j++) + if(!(Math.abs(buff[j] - buff2[j]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Skip.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Skip.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream skip method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Skip { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[512]; + stream.skip(512); + stream.read(buff); + for (int j = 0; j < buff.length; j++) + if(!(Math.abs(buff[j] - test_float_array[j+512]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankFile.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankFile.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(File) method */ + +import java.io.File; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankFile { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + Soundbank dls = new DLSSoundbankReader().getSoundbank(file); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(InputStream) method */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankInputStream { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + Soundbank dls = new DLSSoundbankReader().getSoundbank(bis); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream2.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,119 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(InputStream) method using + very bad InputStream which can only read 1 byte at time */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankInputStream2 { + + private static class BadInputStream extends InputStream + { + + InputStream is; + + public BadInputStream(InputStream is) + { + this.is = is; + } + + public int read() throws IOException { + return is.read(); + } + + public int read(byte[] b, int off, int len) throws IOException { + if(len > 1) len = 1; + return is.read(b, off, len); + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public long skip(long n) throws IOException { + if(n > 1) n = 1; + return is.skip(n); + } + + public int available() throws IOException { + int avail = is.available(); + if(avail > 1) avail = 1; + return avail; + } + + public void close() throws IOException { + is.close(); + } + + public synchronized void mark(int readlimit) { + is.mark(readlimit); + } + + public boolean markSupported() { + return is.markSupported(); + } + + public synchronized void reset() throws IOException { + is.reset(); + } + + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + InputStream badis = new BadInputStream(bis); + Soundbank dls = new DLSSoundbankReader().getSoundbank(badis); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankUrl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankUrl.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(File) method */ + +import java.io.File; +import java.net.URL; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankUrl { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + URL url = file.toURI().toURL(); + Soundbank dls = new DLSSoundbankReader().getSoundbank(url); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/ding.dls Binary file jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/ding.dls has changed diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/EmergencySoundbank/TestCreateSoundbank.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/EmergencySoundbank/TestCreateSoundbank.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test EmergencySoundbank createSoundbank() method */ + +import java.io.File; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.EmergencySoundbank; +import com.sun.media.sound.ModelInstrument; +import com.sun.media.sound.ModelPatch; + +public class TestCreateSoundbank { + + public static void main(String[] args) throws Exception { + + Soundbank soundbank = EmergencySoundbank.createSoundbank(); + for (int i = 0; i < 128; i++) { + Patch patch = new ModelPatch(0, i, false); + ModelInstrument ins = (ModelInstrument)soundbank.getInstrument(patch); + if(ins == null) + throw new Exception("Instrument " + i + " is missing!"); + if(ins.getPerformers().length == 0) + throw new Exception("Instrument " + i + " doesn't have any performers!"); + } + Patch patch = new ModelPatch(0, 0, true); + ModelInstrument ins = (ModelInstrument)soundbank.getInstrument(patch); + if(ins == null) + throw new Exception("Drumkit instrument is missing!"); + if(ins.getPerformers().length == 0) + throw new Exception("Drumkit instrument doesn't have any performers!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetInputStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetInputStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer getInputStream method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetInputStream { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + byte[] b = new byte[test_byte_array.length]; + buff.getInputStream().read(b); + for (int j = 0; j < b.length; j++) + if(b[i] != test_byte_array[i]) + throw new RuntimeException("Byte array compare fails!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetRoot.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetRoot.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer getRoot method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetRoot { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + ModelByteBuffer buff2 = buff.subbuffer(10, 10); + ModelByteBuffer buff3 = buff2.subbuffer(2, 2); + if(buff != buff3.getRoot()) + throw new RuntimeException("ModelByteBuffer doesn't return correct root!"); + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Load.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Load.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,89 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer load method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + + buff.load(); + if(buff.array() == null) + throw new RuntimeException("buf is null!"); + if(buff.array().length != test_byte_array.length) + throw new RuntimeException("buff.array().length length is incorrect!"); + byte[] b = buff.array(); + for (int i = 0; i < b.length; i++) + if(test_byte_array[i] != b[i]) + throw new RuntimeException("buff.array() incorrect!"); + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/LoadAll.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/LoadAll.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,93 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer loadAll method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class LoadAll { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + List col = new ArrayList(); + col.add(buff); + ModelByteBuffer.loadAll(col); + if(buff.array() == null) + throw new RuntimeException("buf is null!"); + if(buff.array().length != test_byte_array.length) + throw new RuntimeException("buff.array().length length is incorrect!"); + byte[] b = buff.array(); + for (int i = 0; i < b.length; i++) + if(test_byte_array[i] != b[i]) + throw new RuntimeException("buff.array() incorrect!"); + + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArray.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,84 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(byte[]) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferByteArray { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_byte_array); + if(buff.array() != test_byte_array) + throw new RuntimeException("buff.bytearray incorrect!"); + if(buff.capacity() != test_byte_array.length) + throw new RuntimeException("buff.capacity() incorrect!"); + if(buff.arrayOffset() != 0) + throw new RuntimeException("buff.arrayOffset not 0!"); + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArrayIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArrayIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,86 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(byte[],int,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferByteArrayIntInt { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_byte_array,10,20); + if(buff.array() != test_byte_array) + throw new RuntimeException("buff.array() incorrect!"); + if(buff.capacity() != 20) + throw new RuntimeException("buff.capacity() not 20!"); + if(buff.arrayOffset() != 10) + throw new RuntimeException("buff.arrayOffset() not 10!"); + if(buff.getFile() != null) + throw new RuntimeException("buff.getFile() not null!"); + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFile.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFile.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,88 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(File) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferFile { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + if(buff.array() != null) + throw new RuntimeException("buff.array() not null!"); + if(buff.capacity() != test_file.length()) + throw new RuntimeException("buff.capacity() incorrect!"); + if(buff.arrayOffset() != 0) + throw new RuntimeException("buff.arrayOffset() not 0!"); + if(buff.getFile() != test_file) + throw new RuntimeException("buff.getFile() incorrect!"); + if(buff.getFilePointer() != 0) + throw new RuntimeException("buff.getFilePointer() not 0!"); + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFileLongLong.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFileLongLong.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,88 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(File,long,long) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferFileLongLong { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file,10,20); + if(buff.array() != null) + throw new RuntimeException("buff.array() not null!"); + if(buff.capacity() != 20) + throw new RuntimeException("buff.capacity() not 20!"); + if(buff.arrayOffset() != 0) + throw new RuntimeException("buff.arrayOffset() not 0!"); + if(buff.getFile() != test_file) + throw new RuntimeException("buff.getFile incorrect!"); + if(buff.getFilePointer() != 10) + throw new RuntimeException("buff.getFilePointer not 10!"); + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Available.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Available.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,107 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream available() method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Available { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + int ret = is.available(); + if(ret != capacity) + throw new RuntimeException("is.available() return unexpected value!"); + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Close.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Close.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream close method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkReset.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkReset.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,129 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream mark and reset methods */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class MarkReset { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + is.mark(1000); + int ret = is.available(); + int a = is.read(); + is.skip(75); + is.reset(); + if(is.available() != ret) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret)+") !"); + int b = is.read(); + if(a != b) + throw new RuntimeException( + "is doesn't return same value after reset (" + + a + "!="+b+") !"); + + is.skip(15); + ret = is.available(); + is.mark(1000); + is.reset(); + if(is.available() != ret) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret)+") !"); + + + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkSupported.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkSupported.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,106 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream markSupported() method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class MarkSupported { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + if(!is.markSupported()) + throw new RuntimeException("InputStream doesn't support mark/reset!"); + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Read.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Read.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,117 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream read() method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Read { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + byte[] b = new byte[100]; + int ret = is.available(); + int n = is.read(); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - 1) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - 1)+") !"); + is.skip(5000); + if(is.read() != -1) + throw new RuntimeException( + "is.read() doesn't return -1!"); + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByte.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByte.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,118 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream read(byte[]) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByte { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + byte[] b = new byte[100]; + int ret = is.available(); + int n = is.read(b); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + is.skip(5000); + if(is.read(b) != -1) + throw new RuntimeException( + "is.read() doesn't return -1!"); + + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByteIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByteIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,118 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream read(byte[], int, int) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByteIntInt { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + byte[] b = new byte[100]; + int ret = is.available(); + int n = is.read(b, 7, 50); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + is.skip(5000); + if(is.read(b, 7, 50) != -1) + throw new RuntimeException( + "is.read() doesn't return -1!"); + + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Skip.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Skip.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,131 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream skip(long) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Skip { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + int ret = is.available(); + long n = is.skip(75); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + + ret = is.available(); + n = is.skip(-100); + if(n != 0) + throw new RuntimeException("is.skip(-100) shouldn't skip values!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + + ret = is.available(); + n = is.skip(5000); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + if(is.available() != 0) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(0)+") !"); } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLong.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLong.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer subbuffer(long) method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SubbufferLong { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + ModelByteBuffer buff2 = buff.subbuffer(10); + if(buff2.getFilePointer() != buff.getFilePointer()) + throw new RuntimeException("buff2.getFilePointer() incorreect!"); + if(buff2.arrayOffset() != 10) + throw new RuntimeException("buff2.arrayOffset() not 10!"); + if(buff2.capacity() != buff.capacity()-10) + throw new RuntimeException("buff2.capacity() not correct!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLong.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLong.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer subbuffer(long,long) method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SubbufferLongLong { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + ModelByteBuffer buff2 = buff.subbuffer(10,21); + if(buff2.getFilePointer() != buff.getFilePointer()) + throw new RuntimeException("buff2.getFilePointer() incorrect!"); + if(buff2.arrayOffset() != 10) + throw new RuntimeException("buff2.arrayOffset() not 10!"); + if(buff2.capacity() != 11) + throw new RuntimeException("buff2.capacity() not 11!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLongBoolean.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLongBoolean.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,98 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer subbuffer(long,long,boolean) method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SubbufferLongLongBoolean { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + ModelByteBuffer buff2 = buff.subbuffer(10,21,true); + if(buff2.getRoot() != buff2); + if(buff2.capacity() != 11); + if(i == 0) + { + if(buff2.getFilePointer() != buff.getFilePointer()+10) + throw new RuntimeException("buff2.getFilePointer() incorrect!"); + } + else + { + if(buff2.arrayOffset() != 10) + throw new RuntimeException("buff2.arrayOffset() not 10!"); + } + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Unload.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Unload.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer unload method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Unload { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + buff.load(); + buff.unload(); + if(buff.array() != null) + throw new RuntimeException("buff.array() not null!"); + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/WriteTo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/WriteTo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer writeTo method */ + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class WriteTo { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + buff.writeTo(baos); + byte[] b = baos.toByteArray(); + for (int j = 0; j < b.length; j++) + if(b[i] != test_byte_array[i]) + throw new RuntimeException("baos.toByteArray() incorrect!"); + } + } + finally + { + tearDown(); + } + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetAttenuation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetAttenuation.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getAttenuation method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetAttenuation { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setAttenuation(10f); + if(wavetable.getAttenuation() != 10f) + throw new RuntimeException("wavetable.getAttenuation() not 10!"); + wavetable.setAttenuation(20f); + if(wavetable.getAttenuation() != 20f) + throw new RuntimeException("wavetable.getAttenuation() not 20!"); + + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetChannels.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetChannels.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getChannels method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetChannels { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + AudioFormat format1 = new AudioFormat(44100, 16, 1, true, false); + AudioFormat format2 = new AudioFormat(44100, 16, 2, true, false); + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format1,10f); + if(wavetable.getChannels() != 1) + throw new RuntimeException("wavetable.getChannels() not 1!"); + wavetable = new ModelByteBufferWavetable(buffer,format2,10f); + if(wavetable.getChannels() != 2) + throw new RuntimeException("wavetable.getChannels() not 2!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopLength.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopLength.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getLoopLength method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetLoopLength { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setLoopLength(10f); + if(wavetable.getLoopLength() != 10f) + throw new RuntimeException("wavetable.getLoopLength() not 10!"); + wavetable.setLoopLength(20f); + if(wavetable.getLoopLength() != 20f) + throw new RuntimeException("wavetable.getLoopLength() not 20!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopStart.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopStart.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getLoopStart method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetLoopStart { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setLoopStart(10f); + if(wavetable.getLoopStart() != 10f) + throw new RuntimeException("wavetable.getLoopStart() not 10!"); + wavetable.setLoopStart(20f); + if(wavetable.getLoopStart() != 20f) + throw new RuntimeException("wavetable.getLoopStart() not 20!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetPitchCorrection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetPitchCorrection.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getPitchCorrect method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetPitchCorrection { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setPitchcorrection(10f); + if(wavetable.getPitchcorrection() != 10f) + throw new RuntimeException("wavetable.getPitchcorrection() not 10!"); + wavetable.setPitchcorrection(20f); + if(wavetable.getPitchcorrection() != 20f) + throw new RuntimeException("wavetable.getPitchcorrection() not 20!"); + + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBuffer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBuffer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,94 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBuffer { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer_wave); + if(wavetable.getBuffer() != buffer_wave) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(!wavetable.getFormat().matches(format)) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormat.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,94 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer, AudioFormat) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBufferAudioFormat { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + if(wavetable.getBuffer() != buffer) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(wavetable.getFormat() != format) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormatFloat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormatFloat.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,94 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer, AudioFormat) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBufferAudioFormatFloat { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + if(wavetable.getBuffer() != buffer) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(!wavetable.getFormat().matches(format)) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferFloat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferFloat.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer, AudioFormat, float) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBufferFloat { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format,10f); + if(wavetable.getBuffer() != buffer) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(!wavetable.getFormat().matches(format)) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + if(wavetable.getPitchcorrection() != 10f) + throw new RuntimeException("wavetable.getPitchcorrection() not 10!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Open.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Open.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable open method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Open { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + if(wavetable.open(44100) != null) + throw new RuntimeException("wavetable.open(44100) doesn't return null!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Set8BitExtensionBuffer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Set8BitExtensionBuffer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,119 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable set8BitExtensionBuffer method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Set8BitExtensionBuffer { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + static float compare(float[] a, float[] b) + { + float ac_error = 0; + int counter = 0; + for (int i = 0; i < a.length; i++) { + ac_error += Math.abs(a[i] - b[i]); + counter++; + } + return ac_error / ((float)counter); + + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer16_8,format,10f); + float[] f1 = new float[testarray.length]; + float[] f2 = new float[testarray.length]; + wavetable.openStream().read(f1); + wavetable.set8BitExtensionBuffer(buffer8); + if(wavetable.get8BitExtensionBuffer() != buffer8) + throw new RuntimeException("wavetable.get8BitExtensionBuffer() incorrect!"); + wavetable.openStream().read(f2); + // f2 should have more accurity than f1, + // about 256 times more, or 8 bits + float spec1 = compare(f1, testarray); + float spec2 = compare(f2, testarray); + if((spec1/spec2) <= 200) + throw new RuntimeException("(spec1/spec2) <= 200!"); + + + } + + + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/SetLoopType.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/SetLoopType.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable SetLoopType method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetLoopType { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setLoopType(1); + if(wavetable.getLoopType() != 1) + throw new RuntimeException("wavetable.getLoopType() not 1!"); + wavetable.setLoopType(2); + if(wavetable.getLoopType() != 2) + throw new RuntimeException("wavetable.getLoopType() not 2!"); + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestination.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestination.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelDestination constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelDestination { + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(); + if(dest.getIdentifier() != ModelDestination.DESTINATION_NONE) + throw new RuntimeException("dest.getIdentifier() is not equals ModelDestination.DESTINATION_NONE!"); + if(!(dest.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("dest.getTransform() is not instancoef ModelStandardTransform!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestinationModelIdentifier.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestinationModelIdentifier.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelDestination(ModelIdentifier) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelDestinationModelIdentifier { + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(ModelDestination.DESTINATION_EG1_ATTACK); + if(dest.getIdentifier() != ModelDestination.DESTINATION_EG1_ATTACK) + throw new RuntimeException("dest.getIdentifier() is not equals ModelDestination.DESTINATION_EG1_ATTACK!"); + if(!(dest.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("dest.getTransform() is not instancoef ModelStandardTransform!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelDestination/SetIdentifier.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetIdentifier.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable setIdentifier(ModelIdentifier) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetIdentifier { + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(); + dest.setIdentifier(ModelDestination.DESTINATION_EG1_ATTACK); + if(dest.getIdentifier() != ModelDestination.DESTINATION_EG1_ATTACK) + throw new RuntimeException("dest.getIdentifier() is not equals ModelDestination.DESTINATION_EG1_ATTACK!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelDestination/SetTransform.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetTransform.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable setTransform(ModelTransform) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetTransform{ + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(); + ModelStandardTransform newtransform = new ModelStandardTransform(); + dest.setTransform(newtransform); + if(dest.getTransform() != newtransform) + throw new RuntimeException("dest.getTransform() is incorrect!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/EqualsObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/EqualsObject.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier equals method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class EqualsObject { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + ModelIdentifier id2 = new ModelIdentifier("test","a",1); + ModelIdentifier id3 = new ModelIdentifier("test","a",2); + ModelIdentifier id4 = new ModelIdentifier("test","b",1); + ModelIdentifier id5 = new ModelIdentifier("hello","a",1); + if(!id.equals(id2)) + throw new RuntimeException("Compare failed!"); + if(id.equals(id3)) + throw new RuntimeException("Compare failed!"); + if(id.equals(id4)) + throw new RuntimeException("Compare failed!"); + if(id.equals(id5)) + throw new RuntimeException("Compare failed!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierString.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierString.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierString { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test"); + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(id.getVariable() != null) + throw new RuntimeException("id.getVariable() doesn't return null!"); + if(id.getInstance() != 0) + throw new RuntimeException("id.getInstance() doesn't return 0!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String, integer) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierStringInt { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test",1); + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(id.getVariable() != null) + throw new RuntimeException("id.getVariable() doesn't return null!"); + if(id.getInstance() != 1) + throw new RuntimeException("id.getInstance() doesn't return 1!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringString.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringString.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String,String) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierStringString { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a"); + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(!id.getVariable().equals("a")) + throw new RuntimeException("id.getVariable() doesn't return \"a\"!"); + if(id.getInstance() != 0) + throw new RuntimeException("id.getInstance() doesn't return 0!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringStringInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringStringInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String,String,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierStringStringInt { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1);; + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(!id.getVariable().equals("a")) + throw new RuntimeException("id.getVariable() doesn't return \"a\"!"); + if(id.getInstance() != 1) + throw new RuntimeException("id.getInstance() doesn't return 1!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetInstance.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetInstance.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier setInstance method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetInstance { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + id.setInstance(2); + if(id.getInstance() != 2) + throw new RuntimeException("id.getInstance() doesn't return 2!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetObject.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetObject.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier setObject method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetObject { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + id.setObject("hello"); + if(!id.getObject().equals("hello")) + throw new RuntimeException("id.getObject() does't return \"hello\"!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetVariable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetVariable.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier setVariable method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVariable { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + id.setVariable("b"); + if(!id.getVariable().equals("b")) + throw new RuntimeException("id.getVariable() does't return \"b\"!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/GetOscillators.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/GetOscillators.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer getOscillators method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetOscillators { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + if(performer.getOscillators() == null) + throw new RuntimeException("performer.getOscillators() returned null!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetConnectionBlocks.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetConnectionBlocks.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setConnectionBlocks method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetConnectionBlocks { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + List newlist = new ArrayList(); + performer.setConnectionBlocks(newlist); + if(performer.getConnectionBlocks() != newlist) + throw new RuntimeException("performer.getConnectionBlocks() returned incorrect data!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetDefaultConnectionsEnabled.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetDefaultConnectionsEnabled.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,49 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setDefaultConnectionsEnabled method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetDefaultConnectionsEnabled { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setDefaultConnectionsEnabled(true); + if(performer.isDefaultConnectionsEnabled() != true) + throw new RuntimeException("performer.isAddDefaultConnectionsEnabled() didn't return true!"); + performer.setDefaultConnectionsEnabled(false); + if(performer.isDefaultConnectionsEnabled() != false) + throw new RuntimeException("performer.isAddDefaultConnectionsEnabled() didn't return false!"); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetExclusiveClass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetExclusiveClass.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setExclusiveClass method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetExclusiveClass { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setExclusiveClass(10); + if(performer.getExclusiveClass() != 10) + throw new RuntimeException("performer.getExclusiveClass() didn't return 10!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyFrom.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyFrom.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setKeyFrom method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetKeyFrom { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setKeyFrom(10); + if(performer.getKeyFrom() != 10) + throw new RuntimeException("performer.getKeyFrom() didn't return 10!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyTo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyTo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setKeyTo method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetKeyTo { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setKeyTo(10); + if(performer.getKeyTo() != 10) + throw new RuntimeException("performer.getKeyTo() didn't return 10!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetName.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetName.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setName method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetName { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setName("hello"); + if(!performer.getName().equals("hello")) + throw new RuntimeException("performer.getName() didn't return \"hello\"!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetSelfNonExclusive.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetSelfNonExclusive.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setSelfNonExclusive method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetSelfNonExclusive { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setSelfNonExclusive(true); + if(performer.isSelfNonExclusive() != true) + throw new RuntimeException("performer.isSelfNonExclusive() didn't return true!"); + performer.setSelfNonExclusive(false); + if(performer.isSelfNonExclusive() != false) + throw new RuntimeException("performer.isSelfNonExclusive() didn't return false!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelFrom.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelFrom.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setVelFrom method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVelFrom { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setVelFrom(10); + if(performer.getVelFrom() != 10) + throw new RuntimeException("performer.getVelFrom() didn't return 10!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelTo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelTo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setVelTo method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVelTo { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setVelTo(10); + if(performer.getVelTo() != 10) + throw new RuntimeException("performer.getVelTo() didn't return 10!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSource.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource() constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSource { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(); + if(src.getIdentifier() != ModelSource.SOURCE_NONE) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NONE!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifier.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifier.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifier { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBoolean.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBoolean.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,49 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierBoolean { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER,ModelStandardTransform.DIRECTION_MAX2MIN); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + ModelStandardTransform trans = (ModelStandardTransform)src.getTransform(); + if(trans.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("trans.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBoolean.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBoolean.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,boolean,boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierBooleanBoolean { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER,ModelStandardTransform.DIRECTION_MAX2MIN,ModelStandardTransform.POLARITY_BIPOLAR); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + ModelStandardTransform trans = (ModelStandardTransform)src.getTransform(); + if(trans.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("trans.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(trans.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("trans.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBooleanInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBooleanInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,boolean,boolean,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierBooleanBooleanInt { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER, + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + ModelStandardTransform trans = (ModelStandardTransform)src.getTransform(); + if(trans.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("trans.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(trans.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("trans.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + if(trans.getTransform() != ModelStandardTransform.TRANSFORM_CONCAVE) + throw new RuntimeException("trans.getTransform() doesn't return ModelStandardTransform.TRANSFORM_CONCAVE!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierModelTransform.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierModelTransform.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,ModelTransform) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierModelTransform { + + public static void main(String[] args) throws Exception { + ModelStandardTransform trans = new ModelStandardTransform(); + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER, trans); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(src.getTransform() != trans) + throw new RuntimeException("src.getTransform() doesn't return trans!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/SetIdentifier.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/SetIdentifier.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource setIdentifier method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetIdentifier { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(); + src.setIdentifier(ModelSource.SOURCE_NOTEON_KEYNUMBER); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelSource/SetTransform.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/SetTransform.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource setTransform method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetTransform { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(); + ModelStandardTransform trans = new ModelStandardTransform(); + src.setTransform(trans); + if(src.getTransform() != trans) + throw new RuntimeException("src.getTransform() doesn't return trans!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransform.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransform.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransform { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MIN2MAX) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MIN2MAX!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_UNIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_UNIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_LINEAR!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBoolean.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBoolean.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform(boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransformBoolean { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(ModelStandardTransform.DIRECTION_MAX2MIN); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_UNIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_UNIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_LINEAR!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBoolean.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBoolean.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform(boolean,boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransformBooleanBoolean { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform( + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_BIPOLAR); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_LINEAR!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBooleanInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBooleanInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform(boolean,boolean,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransformBooleanBooleanInt { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform( + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_CONVEX); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_CONVEX) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_CONVEX!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetDirection.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetDirection.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform setDirection method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetDirection { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetPolarity.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetPolarity.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform setPolarity method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetPolarity { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetTransform.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetTransform.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform setTransform method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetTransform { + + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_CONVEX); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_CONVEX) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_CONVEX!"); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformAbsolute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformAbsolute.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformAbsolute { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_ABSOLUTE); + assertTrue(Math.abs(transform.transform(0.2f) - 0.2f) < 0.0001f); + assertTrue(Math.abs(transform.transform(-0.8f) - 0.8f) < 0.0001f); + assertTrue(checkLinearity(transform)); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConcave.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConcave.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,98 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformConcave { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_CONCAVE); + assertTrue(checkLinearity(transform)); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) < 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) < 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) > -0.5f); + assertTrue(Math.abs(transform.transform(0.5f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) < 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) > -0.5f); + assertTrue(Math.abs(transform.transform(0.50f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) < 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConvex.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConvex.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,98 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformConvex { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_CONVEX); + assertTrue(checkLinearity(transform)); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) > 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) > 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) < -0.5f); + assertTrue(Math.abs(transform.transform(0.5f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) > 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) < -0.5f); + assertTrue(Math.abs(transform.transform(0.50f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) > 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformLinear.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformLinear.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,90 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformLinear { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_LINEAR); + assertTrue(checkLinearity(transform)); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 0.2f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 0.8f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 0.8f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 0.2f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - (-0.6f)) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - (0.6f)) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - (0.6f)) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - (-0.6f)) < 0.0001f); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformSwitch.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformSwitch.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformSwitch { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_SWITCH); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 0.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 1.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 0.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) + 1.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 1.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) + 1.0f) < 0.0001f); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Available.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Available.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader available method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Available { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + int avail = readchunk.available(); + readchunk.readByte(); + assertEquals(avail - 1,readchunk.available()); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Close.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Close.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader close method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + reader.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetFilePointer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetFilePointer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader getFilePointer method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFilePointer { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + long p = readchunk.getFilePointer(); + readchunk.readByte(); + assertEquals(p+1,readchunk.getFilePointer()); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetSize.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetSize.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,77 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader getSize method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetSize { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getSize(), (long)readchunk.available()); + readchunk.readByte(); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/HasNextChunk.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/HasNextChunk.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,85 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader hasNextChunk method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class HasNextChunk { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean a) throws Exception + { + if(!a) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertTrue(reader.hasNextChunk()); + RIFFReader readchunk = reader.nextChunk(); + readchunk.readByte(); + readchunk.close(); + assertTrue(!reader.hasNextChunk()); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Read.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Read.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader read method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Read { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write((byte)33); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(readchunk.read(), 33); + fis.close(); + reader = null; + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByte.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByte.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader read(byte) method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByte { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte((byte)33); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals((int)reader.readByte(), 33); + fis.close(); + reader = null; + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByteArrayIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByteArrayIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader read(byte[], int, int) method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByteArrayIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write(new byte[] {1,2,3}); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(readchunk.read(), 1); + assertEquals(readchunk.read(), 2); + assertEquals(readchunk.read(), 3); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readInt method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeInt(133); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readInt(), 133); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadLong.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadLong.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readLong method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadLong { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeLong(133L); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readLong(), 133L); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadShort.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadShort.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readShort method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadShort { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeShort((short)133); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readShort(), (short)133); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadString.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadString.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readString method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadString { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeString("HELLO",5); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readString(5), "HELLO"); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedByte.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedByte.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readUnsignedByte method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadUnsignedByte { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeUnsignedByte(77); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readUnsignedByte(), 77); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readUnsignedInt method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadUnsignedInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeUnsignedInt(55377); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readUnsignedInt(), 55377L); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedShort.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedShort.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readUnsignedShort method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadUnsignedShort { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeUnsignedShort(377); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readUnsignedShort(), 377); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader skip method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Skip { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write((byte)33); + chunk.write((byte)44); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + reader.skip(1); + assertEquals(readchunk.read(), 44); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/WriteOutputStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/WriteOutputStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffWriter(OutputStream) constructor */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class WriteOutputStream { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writer = new RIFFWriter(baos, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write((byte)33); + writer.close(); + writer = null; + ByteArrayInputStream fis = new ByteArrayInputStream(baos.toByteArray()); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(readchunk.read(), 33); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankFile.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankFile.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(File) method */ + +import java.io.File; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankFile { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(file); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(InputStream) method */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankInputStream { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(bis); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream2.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,119 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(InputStream) method using + very bad InputStream which can only read 1 byte at time */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankInputStream2 { + + private static class BadInputStream extends InputStream + { + + InputStream is; + + public BadInputStream(InputStream is) + { + this.is = is; + } + + public int read() throws IOException { + return is.read(); + } + + public int read(byte[] b, int off, int len) throws IOException { + if(len > 1) len = 1; + return is.read(b, off, len); + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public long skip(long n) throws IOException { + if(n > 1) n = 1; + return is.skip(n); + } + + public int available() throws IOException { + int avail = is.available(); + if(avail > 1) avail = 1; + return avail; + } + + public void close() throws IOException { + is.close(); + } + + public synchronized void mark(int readlimit) { + is.mark(readlimit); + } + + public boolean markSupported() { + return is.markSupported(); + } + + public synchronized void reset() throws IOException { + is.reset(); + } + + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + InputStream badis = new BadInputStream(bis); + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(badis); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankUrl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankUrl.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(File) method */ + +import java.io.File; +import java.net.URL; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankUrl { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + URL url = file.toURI().toURL(); + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(url); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/ding.sf2 Binary file jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/ding.sf2 has changed diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,86 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins); + instrument.add(performers[1]); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrumentIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins, 18, 40); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrumentIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins,18,40,20,75); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument,int,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrumentIntIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins,18,40,20,75,12); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(12, performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformer { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0]); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArray.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[]) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArray { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,89 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[],int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArrayIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers,18,40); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[],int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArrayIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers,18,40,20,75); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[],int,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArrayIntIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers,18,40,20,75,12); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(12, performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,89 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0],18,40); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0],18,40,20,75); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntIntInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntIntInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer,int,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerIntIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0],18,40,20,75,12); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(12, performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/Clear.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/Clear.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument clear method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Clear { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0]); + instrument.clear(); + assertEquals(instrument.getPerformers().length, 0); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetName.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetName.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument setName(String) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetName { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.setName("hello"); + assertEquals(instrument.getName(), "hello"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetPatch.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetPatch.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument setPatch(Patch) method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetPatch { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + Patch patch = new Patch(0,36); + instrument.setPatch(patch); + assertEquals(instrument.getPatch().getProgram(), patch.getProgram()); + assertEquals(instrument.getPatch().getBank(), patch.getBank()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank addInstrument method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(3,7)); + soundbank.addInstrument(ins); + assertEquals(soundbank.getInstruments().length, 1); + assertEquals(soundbank.getInstruments()[0], ins); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddResource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddResource.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank addResource method */ + +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddResource { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SoundbankResource res = new SoundbankResource(soundbank, "test", null) { + public Object getData() { + return null; + }}; + soundbank.addResource(res); + assertEquals(soundbank.getResources().length, 1); + assertEquals(soundbank.getResources()[0], res); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/GetInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/GetInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank getInstrument method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(3,7)); + soundbank.addInstrument(ins); + assertEquals(soundbank.getInstrument(new Patch(3,7)), ins); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/RemoveInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/RemoveInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank removeInstrument method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class RemoveInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean a) throws Exception + { + if(!a) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(3,7)); + soundbank.addInstrument(ins); + soundbank.removeInstrument(ins); + assertEquals(soundbank.getInstruments().length, 0); + assertTrue(soundbank.getInstrument(new Patch(3,7)) == null); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetDescription.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetDescription.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setDescription method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetDescription { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setDescription("hello"); + assertEquals(soundbank.getDescription(), "hello"); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetName.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetName.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setName method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetName { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setName("hello"); + assertEquals(soundbank.getName(), "hello"); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVendor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVendor.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setVendor method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVendor { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setVendor("hello"); + assertEquals(soundbank.getVendor(), "hello"); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVersion.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVersion.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setVersion method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVersion { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setVersion("hello"); + assertEquals(soundbank.getVersion(), "hello"); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Array.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Array.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer array method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Array { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 8, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(377, frm); + float[] ar = buff.array(); + assertEquals(ar.length, 377); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Clear.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Clear.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer clear method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Clear { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 8, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(377, frm); + buff.array(); + assertTrue(!buff.isSilent()); + buff.clear(); + assertTrue(buff.isSilent()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Get.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Get.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,68 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer get method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Get { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 16, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(100, frm); + float[] ar = buff.array(); + for (int i = 0; i < ar.length; i++) { + if(i % 2 == 0) + ar[i] = 1; + if(i % 2 == 0) + ar[i] = -0.5f; + } + + byte[] bbuff = new byte[ar.length*frm.getFrameSize()]; + buff.get(bbuff, 0); + float[] ar2 = new float[ar.length]; + AudioFloatConverter.getConverter(frm).toFloatArray(bbuff, ar2); + + for (int i = 0; i < ar2.length; i++) + if(Math.abs(ar[i] - ar2[i]) > 0.001) + throw new Exception("conversion failure!"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/NewSoftAudioBuffer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/NewSoftAudioBuffer.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,55 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer constructor */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftAudioBuffer { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 8, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(377, frm); + assertEquals(buff.getSize(), 377); + assertEquals(buff.getFormat(), frm); + assertTrue(buff.isSilent()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/DummySourceDataLine.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/DummySourceDataLine.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,232 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.util.ArrayList; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.Control.Type; + +import com.sun.media.sound.AudioFloatConverter; + +/** + * This is a SourceDataLine simulator used for testing SoftSynthesizer + * without using real SourceDataLine / Audio Device. + * + * @author Karl Helgason + */ + +public class DummySourceDataLine implements SourceDataLine { + + private int bufferSize = -1; + + private AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false); + + private DataLine.Info sourceLineInfo; + + private boolean active = false; + + private long framepos = 0; + + private boolean opened = false; + + private int framesize = 0; + + public DummySourceDataLine() + { + ArrayList formats = new ArrayList(); + for (int channels = 1; channels <= 2; channels++) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + for (int bits = 16; bits < 32; bits += 8) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + AudioFormat[] formats_array = formats.toArray(new AudioFormat[formats + .size()]); + sourceLineInfo = new DataLine.Info(SourceDataLine.class, + formats_array, AudioSystem.NOT_SPECIFIED, + AudioSystem.NOT_SPECIFIED); + + } + + public void open() throws LineUnavailableException { + open(format); + } + + public void open(AudioFormat format) throws LineUnavailableException { + if (bufferSize == -1) + bufferSize = ((int) (format.getFrameRate() / 2)) + * format.getFrameSize(); + open(format, bufferSize); + } + + public void open(AudioFormat format, int bufferSize) + throws LineUnavailableException { + this.format = format; + this.bufferSize = bufferSize; + this.framesize = format.getFrameSize(); + opened = true; + } + + public boolean isOpen() { + return opened; + } + + public int write(byte[] b, int off, int len) { + if (!isOpen()) + return 0; + if (len % framesize != 0) + throw new IllegalArgumentException( + "Number of bytes does not represent an integral number of sample frames."); + + + int flen = len / framesize; + framepos += flen; + + long time = (long) (flen * (1000.0 / (double) getFormat() + .getSampleRate())); + try { + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + return 0; + } + + return len; + } + + public int available() { + return 0; + } + + public void drain() { + } + + public void flush() { + } + + public int getBufferSize() { + return bufferSize; + } + + public AudioFormat getFormat() { + return format; + } + + public int getFramePosition() { + return (int) getLongFramePosition(); + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + return framepos; + } + + public long getMicrosecondPosition() { + return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + return active; + } + + public boolean isRunning() { + return active; + } + + public void start() { + active = true; + } + + public void stop() { + active = false; + } + + public void close() { + stop(); + } + + public Control getControl(Type control) { + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return new Control[0]; + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return sourceLineInfo; + } + + public boolean isControlSupported(Type control) { + return false; + } + + public void addLineListener(LineListener listener) { + } + + public void removeLineListener(LineListener listener) { + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetFormat.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetFormat.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer getFormat method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFormat { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + AudioFormat defformat = synth.getFormat(); + assertTrue(defformat != null); + synth.openStream(null, null); + assertTrue(synth.getFormat().toString().equals(defformat.toString())); + synth.close(); + AudioFormat custformat = new AudioFormat(8000, 16, 1, true, false); + synth.openStream(custformat, null); + assertTrue(synth.getFormat().toString().equals(custformat.toString())); + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetPropertyInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetPropertyInfo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,53 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer getPropertyInfo method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetPropertyInfo { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + AudioSynthesizerPropertyInfo[] info = synth.getPropertyInfo(null); + assertTrue(info != null); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/Open.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/Open.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer open method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Open { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + SourceDataLine line = new DummySourceDataLine(); //AudioSystem.getSourceDataLine(new AudioFormat(44100, 16, 2, true, false)); + synth.open(line, null); + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/OpenStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/OpenStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer openStream method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class OpenStream { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.isOpen()); + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/AllNotesOff.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllNotesOff.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel allNotesOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AllNotesOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.allNotesOff(); + soft.read(1); + v = soft.synth.getVoiceStatus(); + assertEquals(v[0].active, false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/AllSoundOff.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllSoundOff.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel allSoundOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AllSoundOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.allSoundOff(); + soft.read(1); + v = soft.synth.getVoiceStatus(); + assertEquals(v[0].active, false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/ChannelPressure.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ChannelPressure.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel channelPressure method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ChannelPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setChannelPressure(10); + assertEquals(channel.getChannelPressure(), 10); + channel.setChannelPressure(90); + assertEquals(channel.getChannelPressure(), 90); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/Controller.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Controller.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,62 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel controller method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Controller { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + for (int i = 0; i < 128; i++) { + if(i == 0 || i == 32) continue; + channel.controlChange(i, 10); + assertEquals(channel.getController(i), 10); + channel.controlChange(i, 100); + assertEquals(channel.getController(i), 100); + } + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/LocalControl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/LocalControl.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,60 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel localControl method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class LocalControl { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + // Local control not supported + // because this is a software synthesizer + // localControl() should always return false + assertEquals(channel.localControl(true), false); + assertEquals(channel.localControl(false), false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/Mono.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mono.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel mono method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setMono(true); + assertEquals(channel.getMono(), true); + channel.setMono(false); + assertEquals(channel.getMono(), false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/Mute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mute.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel mute method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Mute { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setMute(true); + assertEquals(channel.getMute(), true); + channel.setMute(false); + assertEquals(channel.getMute(), false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel noteOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NoteOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.noteOff(60); + soft.read(1); + v = soft.synth.getVoiceStatus();; + assertEquals(v[0].active, false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff2.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel noteOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NoteOff2 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.noteOff(60); + soft.read(1); + v = soft.synth.getVoiceStatus();; + assertEquals(v[0].active, false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOn.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOn.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel noteOn method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NoteOn { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.noteOn(60, 0); + soft.read(1); + v = soft.synth.getVoiceStatus(); + assertEquals(v[0].active, false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/Omni.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Omni.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel omni method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Omni { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setOmni(true); + // Poly or Omni not supported by GM2 + // getOmni() should always return false + assertEquals(channel.getOmni(), false); + channel.setOmni(false); + assertEquals(channel.getOmni(), false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/PitchBend.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/PitchBend.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel pitchBend method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class PitchBend { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setPitchBend(10); + assertEquals(channel.getPitchBend(), 10); + channel.setPitchBend(9000); + assertEquals(channel.getPitchBend(), 9000); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/PolyPressure.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/PolyPressure.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel polyPressure method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class PolyPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + for (int i = 0; i < 128; i++) { + channel.setPolyPressure(i, 10); + assertEquals(channel.getPolyPressure(i),10); + channel.setPolyPressure(i, 100); + assertEquals(channel.getPolyPressure(i),100); + } + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/ProgramChange.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ProgramChange.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel programChange method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProgramChange { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.programChange(36); + assertEquals(channel.getProgram(), 36); + channel.programChange(48); + assertEquals(channel.getProgram(), 48); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/ResetAllControllers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ResetAllControllers.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,132 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel resetAllControllers method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ResetAllControllers { + + public static boolean[] dontResetControls = new boolean[128]; + static { + for (int i = 0; i < dontResetControls.length; i++) + dontResetControls[i] = false; + + dontResetControls[0] = true; // Bank Select (MSB) + dontResetControls[32] = true; // Bank Select (LSB) + dontResetControls[7] = true; // Channel Volume (MSB) + dontResetControls[8] = true; // Balance (MSB) + dontResetControls[10] = true; // Pan (MSB) + dontResetControls[11] = true; // Expression (MSB) + dontResetControls[91] = true; // Effects 1 Depth (default: Reverb Send) + dontResetControls[92] = true; // Effects 2 Depth (default: Tremolo Depth) + dontResetControls[93] = true; // Effects 3 Depth (default: Chorus Send) + dontResetControls[94] = true; // Effects 4 Depth (default: Celeste [Detune] Depth) + dontResetControls[95] = true; // Effects 5 Depth (default: Phaser Depth) + dontResetControls[70] = true; // Sound Controller 1 (default: Sound Variation) + dontResetControls[71] = true; // Sound Controller 2 (default: Timbre / Harmonic Quality) + dontResetControls[72] = true; // Sound Controller 3 (default: Release Time) + dontResetControls[73] = true; // Sound Controller 4 (default: Attack Time) + dontResetControls[74] = true; // Sound Controller 5 (default: Brightness) + dontResetControls[75] = true; // Sound Controller 6 (GM2 default: Decay Time) + dontResetControls[76] = true; // Sound Controller 7 (GM2 default: Vibrato Rate) + dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth) + dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay) + dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined) + dontResetControls[120] = true; // All Sound Off + dontResetControls[121] = true; // Reset All Controllers + dontResetControls[122] = true; // Local Control On/Off + dontResetControls[123] = true; // All Notes Off + dontResetControls[124] = true; // Omni Mode Off + dontResetControls[125] = true; // Omni Mode On + dontResetControls[126] = true; // Poly Mode Off + dontResetControls[127] = true; // Poly Mode On + + dontResetControls[6] = true; // Data Entry (MSB) + dontResetControls[38] = true; // Data Entry (LSB) + dontResetControls[96] = true; // Data Increment + dontResetControls[97] = true; // Data Decrement + dontResetControls[98] = true; // Non-Registered Parameter Number (LSB) + dontResetControls[99] = true; // Non-Registered Parameter Number(MSB) + dontResetControls[100] = true; // RPN = Null + dontResetControls[101] = true; // RPN = Null + } + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + // First let all controls contain non-default values + for (int i = 0; i < 128; i++) + channel.setPolyPressure(i, 10); + channel.setChannelPressure(10); + channel.setPitchBend(2192); + for (int i = 0; i < 120; i++) + channel.controlChange(i, 1); + channel.resetAllControllers(); + + // Now check if resetAllControllers did what it was suppose to do + + for (int i = 0; i < 128; i++) + assertEquals(channel.getPolyPressure(i), 0); + assertEquals(channel.getChannelPressure(), 0); + assertEquals(channel.getPitchBend(),8192); + for (int i = 0; i < 120; i++) + if(!dontResetControls[i]) + assertEquals(channel.getController(i), 0); + assertEquals(channel.getController(71), 64); // Filter Resonance + assertEquals(channel.getController(72), 64); // Release Time + assertEquals(channel.getController(73), 64); // Attack Time + assertEquals(channel.getController(74), 64); // Brightness + assertEquals(channel.getController(75), 64); // Decay Time + assertEquals(channel.getController(76), 64); // Vibrato Rate + assertEquals(channel.getController(77), 64); // Vibrato Depth + assertEquals(channel.getController(78), 64); // Vibrato Delay + assertEquals(channel.getController(8), 64); // Balance + assertEquals(channel.getController(11), 127); // Expression + assertEquals(channel.getController(98), 127); // NRPN Null + assertEquals(channel.getController(99), 127); // NRPN Null + assertEquals(channel.getController(100), 127); // RPN = Null + assertEquals(channel.getController(101), 127); // RPN = Null + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/SoftTestUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/SoftTestUtils.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,111 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.io.IOException; + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SoftTestUtils { + + public AudioSynthesizer synth = new SoftSynthesizer(); + public AudioInputStream stream; + public byte[] tmpbuffer = new byte[1024]; + + public static SF2Soundbank createTestSoundBank() + { + SF2Soundbank sf2 = new SF2Soundbank(); + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + float[] data = new float[44100+1000]; + float fr = 440/format.getSampleRate(); + for (int i = 0; i < data.length; i++) + data[i] = (float)Math.sin(i*fr*2*Math.PI); + byte[] bdata = new byte[data.length*format.getFrameSize()]; + AudioFloatConverter.getConverter(format).toByteArray(data, bdata); + SF2Sample sample = new SF2Sample(sf2); + sample.setName("Test Sample"); + sample.setData(bdata); + sample.setStartLoop(500); + sample.setEndLoop(data.length - 500); + sample.setSampleRate((long) format.getSampleRate()); + sample.setOriginalPitch(69); + sf2.addResource(sample); + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Test Layer"); + sf2.addResource(layer); + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.setSample(sample); + layer.getRegions().add(region); + SF2Instrument ins = new SF2Instrument(sf2); + ins.setName("Test Instrument"); + sf2.addInstrument(ins); + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layer); + ins.getRegions().add(insregion); + + return sf2; + } + + public SoftTestUtils() throws Exception { + stream = synth.openStream(null, null); + synth.unloadAllInstruments(synth.getDefaultSoundbank()); + synth.loadAllInstruments(createTestSoundBank()); + } + + public void close() throws Exception { + stream.close(); + stream = null; + synth.close(); + synth = null; + } + + public void read(double seconds) throws IOException + { + int bufflen = + stream.getFormat().getFrameSize() * + (int)(stream.getFormat().getFrameRate() * seconds); + while(bufflen != 0) + { + if(bufflen > 1024) + bufflen -= stream.read(tmpbuffer,0,1024); + else + bufflen -= stream.read(tmpbuffer,0, bufflen); + } + } + + public VoiceStatus findVoice(int channel, int note) { + VoiceStatus[] v = synth.getVoiceStatus(); + for (int k = 0; k < v.length; k++) + if(v[k].active) + if(v[k].channel == channel) + if(v[k].note == note) + return v[k]; + return null; + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftChannel/Solo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Solo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel solo method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Solo { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setSolo(true); + assertEquals(channel.getSolo(), true); + channel.setSolo(false); + assertEquals(channel.getSolo(), false); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftCubicResampler/Interpolate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftCubicResampler/Interpolate.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftCubicResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftCubicResampler resampler = new SoftCubicResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.005) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.005) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.005) + fail("Interpolation failed, error="+max); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLanczosResampler/Interpolate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLanczosResampler/Interpolate.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLanczosResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftLanczosResampler resampler = new SoftLanczosResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.01) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.01) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.01) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + testdata2[i] = (float)Math.sin(i*0.4)*0.9f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i] - 1) > 0.00001) + throw new Exception("input != output"); + if(Math.abs(out2a[i] - testdata2[i] - 1) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix_mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i] - 1) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono_overdrive.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono_overdrive.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,84 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix_mono_overdrive { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]-1) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_overdrive.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_overdrive.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix_overdrive { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + testdata2[i] = (float)Math.sin(i*0.4)*2.5f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]-1) > 1.0) + throw new Exception("abs(output)>1"); + if(Math.abs(out2a[i]-1) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_normal { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + testdata2[i] = (float)Math.sin(i*0.4)*0.9f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i]) > 0.00001) + throw new Exception("input != output"); + if(Math.abs(out2a[i] - testdata2[i]) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal_mono.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal_mono.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_normal_mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i]) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_overdrive { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + testdata2[i] = (float)Math.sin(i*0.4)*2.5f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]) > 1.0) + throw new Exception("abs(output)>1"); + if(Math.abs(out2a[i]) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive_mono.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive_mono.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_overdrive_mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLinearResampler/Interpolate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler/Interpolate.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLinearResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftLinearResampler resampler = new SoftLinearResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.001) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftLinearResampler2/Interpolate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler2/Interpolate.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLinearResampler2 interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftLinearResampler2 resampler = new SoftLinearResampler2(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftPointResampler/Interpolate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftPointResampler/Interpolate.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftPointResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftPointResampler resampler = new SoftPointResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftProvider getDevice method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetDevice { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + + private static class FakeInfo extends Info { + public FakeInfo() { + super("a", "b", "c", "d"); + } + } + + public static void main(String[] args) throws Exception { + SoftProvider provider = new SoftProvider(); + Info[] infos = provider.getDeviceInfo(); + assertTrue(infos.length > 0); + for (int i = 0; i < infos.length; i++) { + assertTrue(infos[i] != null); + MidiDevice d = provider.getDevice(infos[i]); + assertTrue(d instanceof SoftSynthesizer); + } + assertTrue(provider.getDevice(new FakeInfo()) == null); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Close.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Close.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver close method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + assertEquals(soft.synth.getReceivers().size(), 1); + receiver.close(); + assertEquals(soft.synth.getReceivers().size(), 0); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ActiveSense.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ActiveSense.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ActiveSense { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void sendActiveSens(Receiver r) throws Exception + { + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.ACTIVE_SENSING); + r.send(smsg, -1); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + sendActiveSens(receiver); + + // 1. Check if notes are keept active + // if send active sens every 200-300 msec + + sendActiveSens(receiver); + channel.noteOn(60, 64); + assertTrue(soft.findVoice(0,60) != null); + for (int i = 0; i < 10; i++) { + soft.read(0.2); // read 200 msec + sendActiveSens(receiver); + assertTrue(soft.findVoice(0,60) != null); + } + // 2. Now we stop send active sense message + // and the note should be killed off + soft.read(2); + assertTrue(soft.findVoice(0,60) == null); + + + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllNotesOff.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllNotesOff.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_AllNotesOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 123,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllSoundOff.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllSoundOff.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_AllSoundOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 120,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ChannelPressure.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ChannelPressure.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ChannelPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CHANNEL_PRESSURE,0, 10,0); + receiver.send(smsg, -1); + assertEquals(channel.getChannelPressure(), 10); + smsg.setMessage(ShortMessage.CHANNEL_PRESSURE,0, 90,0); + receiver.send(smsg, -1); + assertEquals(channel.getChannelPressure(), 90); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Controller.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Controller.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,66 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_Controller { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + for (int i = 0; i < 128; i++) { + if(i == 0 || i == 32) continue; + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, i,10); + receiver.send(smsg, -1); + assertEquals(channel.getController(i), 10); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, i,100); + receiver.send(smsg, -1); + assertEquals(channel.getController(i), 100); + } + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Mono.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Mono.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_Mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 126,100); + receiver.send(smsg, -1); + assertEquals(channel.getMono(), false); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 126,1); + receiver.send(smsg, -1); + assertEquals(channel.getMono(), true); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 127,0); + receiver.send(smsg, -1); + assertEquals(channel.getMono(), false); + + // Check if send mono triggers AllNotesOff + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 127,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOff.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOff.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.NOTE_OFF,0, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_AllChannels.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_AllChannels.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,71 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn_AllChannels { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + for (int i = 0; i < 15; i++) { + if(i == 9) i++; + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,i, 60, 64); + receiver.send(smsg, -1); + soft.read(1); + VoiceStatus voice = soft.findVoice(i,60); + assertTrue(voice != null); + smsg.setMessage(ShortMessage.NOTE_ON,i, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + voice = soft.findVoice(i,60); + assertTrue(voice == null); + soft.read(1); + } + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Delayed.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Delayed.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,67 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn_Delayed { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, 2000000); // Delay sending note for 2 sec + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + soft.read(2); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Multiple.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Multiple.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,76 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn_Multiple { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, -1); + smsg.setMessage(ShortMessage.NOTE_ON,0, 61, 64); + receiver.send(smsg, -1); + smsg.setMessage(ShortMessage.NOTE_ON,0, 62, 64); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + assertTrue(soft.findVoice(0,61) != null); + assertTrue(soft.findVoice(0,62) != null); + + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 0); + receiver.send(smsg, -1); + smsg.setMessage(ShortMessage.NOTE_ON,0, 61, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + assertTrue(soft.findVoice(0,61) == null); + assertTrue(soft.findVoice(0,62) != null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Omni.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Omni.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_Omni { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 125,0); + receiver.send(smsg, -1); + // Poly or Omni not supported by GM2 + // getOmni() should always return false + assertEquals(channel.getOmni(), false); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 124,0); + receiver.send(smsg, -1); + assertEquals(channel.getOmni(), false); + + // Check if send omni triggers AllNotesOff + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 124,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PitchBend.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PitchBend.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_PitchBend { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.PITCH_BEND,0, 10,0); + receiver.send(smsg, -1); + assertEquals(channel.getPitchBend(), 10); + smsg.setMessage(ShortMessage.PITCH_BEND,0, 9000%128,9000/128); + receiver.send(smsg, -1); + assertEquals(channel.getPitchBend(), 9000); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PolyPressure.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PolyPressure.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_PolyPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + for (int i = 0; i < 128; i++) { + smsg.setMessage(ShortMessage.POLY_PRESSURE,0, i, 10); + receiver.send(smsg, -1); + assertEquals(channel.getPolyPressure(i),10); + smsg.setMessage(ShortMessage.POLY_PRESSURE,0, i, 100); + receiver.send(smsg, -1); + assertEquals(channel.getPolyPressure(i),100); + } + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ProgramChange.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ProgramChange.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ProgramChange { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.PROGRAM_CHANGE,0, 36,0); + receiver.send(smsg, -1); + assertEquals(channel.getProgram(), 36); + smsg.setMessage(ShortMessage.PROGRAM_CHANGE,0, 48,0); + receiver.send(smsg, -1); + assertEquals(channel.getProgram(), 48); + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ResetAllControllers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ResetAllControllers.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,136 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ResetAllControllers { + + public static boolean[] dontResetControls = new boolean[128]; + static { + for (int i = 0; i < dontResetControls.length; i++) + dontResetControls[i] = false; + + dontResetControls[0] = true; // Bank Select (MSB) + dontResetControls[32] = true; // Bank Select (LSB) + dontResetControls[7] = true; // Channel Volume (MSB) + dontResetControls[8] = true; // Balance (MSB) + dontResetControls[10] = true; // Pan (MSB) + dontResetControls[11] = true; // Expression (MSB) + dontResetControls[91] = true; // Effects 1 Depth (default: Reverb Send) + dontResetControls[92] = true; // Effects 2 Depth (default: Tremolo Depth) + dontResetControls[93] = true; // Effects 3 Depth (default: Chorus Send) + dontResetControls[94] = true; // Effects 4 Depth (default: Celeste [Detune] Depth) + dontResetControls[95] = true; // Effects 5 Depth (default: Phaser Depth) + dontResetControls[70] = true; // Sound Controller 1 (default: Sound Variation) + dontResetControls[71] = true; // Sound Controller 2 (default: Timbre / Harmonic Quality) + dontResetControls[72] = true; // Sound Controller 3 (default: Release Time) + dontResetControls[73] = true; // Sound Controller 4 (default: Attack Time) + dontResetControls[74] = true; // Sound Controller 5 (default: Brightness) + dontResetControls[75] = true; // Sound Controller 6 (GM2 default: Decay Time) + dontResetControls[76] = true; // Sound Controller 7 (GM2 default: Vibrato Rate) + dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth) + dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay) + dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined) + dontResetControls[120] = true; // All Sound Off + dontResetControls[121] = true; // Reset All Controllers + dontResetControls[122] = true; // Local Control On/Off + dontResetControls[123] = true; // All Notes Off + dontResetControls[124] = true; // Omni Mode Off + dontResetControls[125] = true; // Omni Mode On + dontResetControls[126] = true; // Poly Mode Off + dontResetControls[127] = true; // Poly Mode On + + dontResetControls[6] = true; // Data Entry (MSB) + dontResetControls[38] = true; // Data Entry (LSB) + dontResetControls[96] = true; // Data Increment + dontResetControls[97] = true; // Data Decrement + dontResetControls[98] = true; // Non-Registered Parameter Number (LSB) + dontResetControls[99] = true; // Non-Registered Parameter Number(MSB) + dontResetControls[100] = true; // RPN = Null + dontResetControls[101] = true; // RPN = Null + } + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + // First let all controls contain non-default values + for (int i = 0; i < 128; i++) + channel.setPolyPressure(i, 10); + channel.setChannelPressure(10); + channel.setPitchBend(2192); + for (int i = 0; i < 120; i++) + channel.controlChange(i, 1); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 121,0); + receiver.send(smsg, -1); + + // Now check if resetAllControllers did what it was suppose to do + + for (int i = 0; i < 128; i++) + assertEquals(channel.getPolyPressure(i), 0); + assertEquals(channel.getChannelPressure(), 0); + assertEquals(channel.getPitchBend(),8192); + for (int i = 0; i < 120; i++) + if(!dontResetControls[i]) + assertEquals(channel.getController(i), 0); + assertEquals(channel.getController(71), 64); // Filter Resonance + assertEquals(channel.getController(72), 64); // Release Time + assertEquals(channel.getController(73), 64); // Attack Time + assertEquals(channel.getController(74), 64); // Brightness + assertEquals(channel.getController(75), 64); // Decay Time + assertEquals(channel.getController(76), 64); // Vibrato Rate + assertEquals(channel.getController(77), 64); // Vibrato Depth + assertEquals(channel.getController(78), 64); // Vibrato Delay + assertEquals(channel.getController(8), 64); // Balance + assertEquals(channel.getController(11), 127); // Expression + assertEquals(channel.getController(98), 127); // NRPN Null + assertEquals(channel.getController(99), 127); // NRPN Null + assertEquals(channel.getController(100), 127); // RPN = Null + assertEquals(channel.getController(101), 127); // RPN = Null + + soft.close(); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftReceiver/SoftTestUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/SoftTestUtils.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,111 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.io.IOException; + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SoftTestUtils { + + public AudioSynthesizer synth = new SoftSynthesizer(); + public AudioInputStream stream; + public byte[] tmpbuffer = new byte[1024]; + + public static SF2Soundbank createTestSoundBank() + { + SF2Soundbank sf2 = new SF2Soundbank(); + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + float[] data = new float[44100+1000]; + float fr = 440/format.getSampleRate(); + for (int i = 0; i < data.length; i++) + data[i] = (float)Math.sin(i*fr*2*Math.PI); + byte[] bdata = new byte[data.length*format.getFrameSize()]; + AudioFloatConverter.getConverter(format).toByteArray(data, bdata); + SF2Sample sample = new SF2Sample(sf2); + sample.setName("Test Sample"); + sample.setData(bdata); + sample.setStartLoop(500); + sample.setEndLoop(data.length - 500); + sample.setSampleRate((long) format.getSampleRate()); + sample.setOriginalPitch(69); + sf2.addResource(sample); + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Test Layer"); + sf2.addResource(layer); + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.setSample(sample); + layer.getRegions().add(region); + SF2Instrument ins = new SF2Instrument(sf2); + ins.setName("Test Instrument"); + sf2.addInstrument(ins); + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layer); + ins.getRegions().add(insregion); + + return sf2; + } + + public SoftTestUtils() throws Exception { + stream = synth.openStream(null, null); + synth.unloadAllInstruments(synth.getDefaultSoundbank()); + synth.loadAllInstruments(createTestSoundBank()); + } + + public void close() throws Exception { + stream.close(); + stream = null; + synth.close(); + synth = null; + } + + public void read(double seconds) throws IOException + { + int bufflen = + stream.getFormat().getFrameSize() * + (int)(stream.getFormat().getFrameRate() * seconds); + while(bufflen != 0) + { + if(bufflen > 1024) + bufflen -= stream.read(tmpbuffer,0,1024); + else + bufflen -= stream.read(tmpbuffer,0, bufflen); + } + } + + public VoiceStatus findVoice(int channel, int note) { + VoiceStatus[] v = synth.getVoiceStatus(); + for (int k = 0; k < v.length; k++) + if(v[k].active) + if(v[k].channel == channel) + if(v[k].note == note) + return v[k]; + return null; + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSincResampler/Interpolate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSincResampler/Interpolate.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSincResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftSincResampler resampler = new SoftSincResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.0001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.0001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.0001) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Close.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Close.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer close method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class Close { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + synth.close(); + assertTrue(!synth.isOpen()); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/DummySourceDataLine.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/DummySourceDataLine.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,232 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.util.ArrayList; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.Control.Type; + +import com.sun.media.sound.AudioFloatConverter; + +/** + * This is a SourceDataLine simulator used for testing SoftSynthesizer + * without using real SourceDataLine / Audio Device. + * + * @author Karl Helgason + */ + +public class DummySourceDataLine implements SourceDataLine { + + private int bufferSize = -1; + + private AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false); + + private DataLine.Info sourceLineInfo; + + private boolean active = false; + + private long framepos = 0; + + private boolean opened = false; + + private int framesize = 0; + + public DummySourceDataLine() + { + ArrayList formats = new ArrayList(); + for (int channels = 1; channels <= 2; channels++) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + for (int bits = 16; bits < 32; bits += 8) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + AudioFormat[] formats_array = formats.toArray(new AudioFormat[formats + .size()]); + sourceLineInfo = new DataLine.Info(SourceDataLine.class, + formats_array, AudioSystem.NOT_SPECIFIED, + AudioSystem.NOT_SPECIFIED); + + } + + public void open() throws LineUnavailableException { + open(format); + } + + public void open(AudioFormat format) throws LineUnavailableException { + if (bufferSize == -1) + bufferSize = ((int) (format.getFrameRate() / 2)) + * format.getFrameSize(); + open(format, bufferSize); + } + + public void open(AudioFormat format, int bufferSize) + throws LineUnavailableException { + this.format = format; + this.bufferSize = bufferSize; + this.framesize = format.getFrameSize(); + opened = true; + } + + public boolean isOpen() { + return opened; + } + + public int write(byte[] b, int off, int len) { + if (!isOpen()) + return 0; + if (len % framesize != 0) + throw new IllegalArgumentException( + "Number of bytes does not represent an integral number of sample frames."); + + + int flen = len / framesize; + framepos += flen; + + long time = (long) (flen * (1000.0 / (double) getFormat() + .getSampleRate())); + try { + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + return 0; + } + + return len; + } + + public int available() { + return 0; + } + + public void drain() { + } + + public void flush() { + } + + public int getBufferSize() { + return bufferSize; + } + + public AudioFormat getFormat() { + return format; + } + + public int getFramePosition() { + return (int) getLongFramePosition(); + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + return framepos; + } + + public long getMicrosecondPosition() { + return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + return active; + } + + public boolean isRunning() { + return active; + } + + public void start() { + active = true; + } + + public void stop() { + active = false; + } + + public void close() { + stop(); + } + + public Control getControl(Type control) { + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return new Control[0]; + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return sourceLineInfo; + } + + public boolean isControlSupported(Type control) { + return false; + } + + public void addLineListener(LineListener listener) { + } + + public void removeLineListener(LineListener listener) { + } + +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetAvailableInstruments.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetAvailableInstruments.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getAvailableInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetAvailableInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(defsbk.getInstruments().length == synth.getAvailableInstruments().length); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetChannels.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetChannels.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getChannels method */ + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetChannels { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.getChannels() != null); + assertTrue(synth.getChannels().length == 16); + MidiChannel[] channels = synth.getChannels(); + for (int i = 0; i < channels.length; i++) { + assertTrue(channels[i] != null); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDefaultSoundbank.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDefaultSoundbank.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getDefaultSoundbank method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetDefaultSoundbank { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.getDefaultSoundbank() != null); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDeviceInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDeviceInfo.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getDeviceInfo method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetDeviceInfo { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + assertTrue(synth.getDeviceInfo() != null); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLatency.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLatency.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getLatency method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetLatency { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + assertTrue(synth.getLatency() != -1); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLoadedInstruments.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLoadedInstruments.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getLoadedInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetLoadedInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + synth.unloadAllInstruments(defsbk); + synth.loadAllInstruments(defsbk); + assertTrue(synth.getLoadedInstruments().length != 0); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxPolyphony.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxPolyphony.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMaxPolyphony method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMaxPolyphony { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.getMaxPolyphony() != -1); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxReceivers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxReceivers.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMaxReceivers method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMaxReceivers { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + assertTrue(synth.getMaxReceivers() == -1); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxTransmitters.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxTransmitters.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMaxTransmitters method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMaxTransmitters { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + assertTrue(synth.getMaxTransmitters() == 0); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMicrosecondPosition.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMicrosecondPosition.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMicrosecondPosition method */ + +import java.io.IOException; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMicrosecondPosition { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + AudioInputStream stream = synth.openStream(null, null); + assertTrue(synth.getMicrosecondPosition() == 0); + AudioFormat format = stream.getFormat(); + byte[] buff = new byte[((int)format.getFrameRate())*format.getFrameSize()];; + stream.read(buff); + assertTrue(Math.abs(synth.getMicrosecondPosition()-1000000) < 10000); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getReceiver method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetReceiver { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + Receiver recv = synth.getReceiver(); + assertTrue(recv != null); + Receiver recv2 = synth.getReceiver(); + assertTrue(recv2 != null); + assertTrue(recv2 != recv); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver2.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getReceiver method */ + +import javax.sound.midi.Receiver; +import javax.sound.midi.ShortMessage; + +import com.sun.media.sound.AudioSynthesizer; +import com.sun.media.sound.SoftSynthesizer; + +public class GetReceiver2 { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + Receiver recv = synth.getReceiver(); + assertTrue(recv != null); + ShortMessage sm = new ShortMessage(); + sm.setMessage(ShortMessage.NOTE_OFF, 0, 64, 64); + synth.open(new DummySourceDataLine(), null); + recv.send(sm, -1); + synth.close(); + try + { + recv.send(sm, -1); + throw new RuntimeException("Exception not thrown!"); + } + catch(Exception e) + { + // Just checking if exception is thrown + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceivers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceivers.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getReceivers method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetReceivers { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + assertTrue(synth.getReceivers().size() == 0); + Receiver recv = synth.getReceiver(); + assertTrue(synth.getReceivers().size() == 1); + recv.close(); + assertTrue(synth.getReceivers().size() == 0); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitter.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getTransmitter method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetTransmitter { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + try + { + synth.getTransmitter(); + throw new Exception("MidiUnavailableException not thrown!"); + } catch (MidiUnavailableException e) { + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitters.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitters.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getTransmitters method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetTransmitters { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + assertTrue(synth.getTransmitters().size() == 0); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetVoiceStatus.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetVoiceStatus.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getVoiceStatus method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.VoiceStatus; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetVoiceStatus { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + VoiceStatus[] v = synth.getVoiceStatus(); + assertTrue(v != null); + assertTrue(synth.getChannels().length != synth.getMaxPolyphony()); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ImplicitOpenClose.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ImplicitOpenClose.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,105 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer implicit open/close using getReceiver. */ + +import java.lang.reflect.Field; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.midi.Synthesizer; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class ImplicitOpenClose { + + public static void main(String[] args) throws Exception { + Field f = SoftSynthesizer.class.getDeclaredField("testline"); + f.setAccessible(true); + f.set(null, new DummySourceDataLine()); + + Synthesizer synth = new SoftSynthesizer(); + + ReferenceCountingDevice rcd = (ReferenceCountingDevice)synth; + + // Test single open/close cycle + + Receiver recv = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + recv.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + // Test using 2 receiver cycle + + Receiver recv1 = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + Receiver recv2 = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + + recv2.close(); + if(!synth.isOpen()) + throw new Exception("Synthesizer was closed!"); + recv1.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + // Test for explicit,implicit conflict + + synth.open(); + Receiver recv3 = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + recv3.close(); + if(!synth.isOpen()) + throw new Exception("Synthesizer was closed!"); + synth.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + // Test for implicit,explicit conflict + + recv3 = rcd.getReceiverReferenceCounting(); + synth.open(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + recv3.close(); + if(!synth.isOpen()) + throw new Exception("Synthesizer was closed!"); + synth.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsOpen.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsOpen.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer isOpen method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class IsOpen { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.isOpen()); + synth.close(); + assertTrue(!synth.isOpen()); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsSoundbankSupported.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsSoundbankSupported.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer isSoundbankSupported method */ + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class IsSoundbankSupported { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + sbk.addInstrument(ins); + assertTrue(synth.isSoundbankSupported(sbk)); + Soundbank dummysbk = new Soundbank() + { + public String getName() { + return null; + } + public String getVersion() { + return null; + } + public String getVendor() { + return null; + } + public String getDescription() { + return null; + } + public SoundbankResource[] getResources() { + return null; + } + public Instrument[] getInstruments() { + Instrument ins = new Instrument(null, null, null, null) + { + public Object getData() { + return null; + } + }; + return new Instrument[] {ins}; + } + public Instrument getInstrument(Patch patch) { + return null; + } + }; + assertTrue(!synth.isSoundbankSupported(dummysbk)); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadAllInstruments.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadAllInstruments.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer loadAllInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class LoadAllInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadAllInstruments(sbk); + assertTrue(synth.getLoadedInstruments().length == 2); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer loadAllInstrument method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class LoadInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 1); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstruments.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstruments.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer loadAllInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class LoadInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstruments(sbk, new Patch[] {ins2.getPatch()}); + assertTrue(synth.getLoadedInstruments().length == 1); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Open.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Open.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer open method */ + +import java.lang.reflect.Field; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class Open { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + Field f = SoftSynthesizer.class.getDeclaredField("testline"); + f.setAccessible(true); + f.set(null, new DummySourceDataLine()); + + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(); + assertTrue(synth.isOpen()); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/OpenStream.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/OpenStream.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer openStream method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class OpenStream { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.isOpen()); + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/RemapInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/RemapInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,76 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer remapInstrument method */ + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class RemapInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + Instrument ins0 = defsbk.getInstrument(new Patch(0,0)); + Instrument ins10 = defsbk.getInstrument(new Patch(0,10)); + assertTrue(synth.remapInstrument(ins0, ins10)); + Instrument[] loaded = synth.getLoadedInstruments(); + for (int i = 0; i < loaded.length; i++) { + if(loaded[i].getPatch().getBank() == 0) + if(loaded[i].getPatch().getProgram() == 10) + { + assertEquals(loaded[i].getName(), ins0.getName()); + break; + } + } + + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestRender1.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestRender1.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,214 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer simple note rendering in many settings */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +import javax.sound.sampled.*; +import javax.sound.midi.*; + +import com.sun.media.sound.*; + +public class TestRender1 { + + public static double send(Sequence seq, Receiver recv) { + float divtype = seq.getDivisionType(); + assert (seq.getDivisionType() == Sequence.PPQ); + Track[] tracks = seq.getTracks(); + int[] trackspos = new int[tracks.length]; + int mpq = 60000000 / 100; + int seqres = seq.getResolution(); + long lasttick = 0; + long curtime = 0; + while (true) { + MidiEvent selevent = null; + int seltrack = -1; + for (int i = 0; i < tracks.length; i++) { + int trackpos = trackspos[i]; + Track track = tracks[i]; + if (trackpos < track.size()) { + MidiEvent event = track.get(trackpos); + if (selevent == null + || event.getTick() < selevent.getTick()) { + selevent = event; + seltrack = i; + } + } + } + if (seltrack == -1) + break; + trackspos[seltrack]++; + long tick = selevent.getTick(); + if (divtype == Sequence.PPQ) + curtime += ((tick - lasttick) * mpq) / seqres; + else + curtime = (long) ((tick * 1000000.0 * divtype) / seqres); + lasttick = tick; + MidiMessage msg = selevent.getMessage(); + if (msg instanceof MetaMessage) { + if (divtype == Sequence.PPQ) + if (((MetaMessage) msg).getType() == 0x51) { + byte[] data = ((MetaMessage) msg).getData(); + mpq = ((data[0] & 0xff) << 16) + | ((data[1] & 0xff) << 8) | (data[2] & 0xff); + } + } else { + if (recv != null) + recv.send(msg, curtime); + } + } + + return curtime / 1000000.0; + } + + public static void test(AudioFormat format, Map info) + throws Exception { + OutputStream nullout = new OutputStream() { + public void write(int b) throws IOException { + } + + public void write(byte[] b, int off, int len) throws IOException { + } + + public void write(byte[] b) throws IOException { + } + }; + render(nullout, format, info); + } + + public static void render(OutputStream os, AudioFormat format, + Map info) throws Exception { + AudioSynthesizer synth = (AudioSynthesizer) new SoftSynthesizer(); + AudioInputStream stream = synth.openStream(format, info); + Receiver recv = synth.getReceiver(); + Soundbank defsbk = synth.getDefaultSoundbank(); + if (defsbk != null) + synth.unloadAllInstruments(defsbk); + synth.loadAllInstruments(soundbank); + + double totalTime = 5; + send(sequence, recv); + + long len = (long) (stream.getFormat().getFrameRate() * (totalTime + 4)); + stream = new AudioInputStream(stream, stream.getFormat(), len); + + long t = System.currentTimeMillis(); + AudioSystem.write(stream, AudioFileFormat.Type.WAVE, os); + t = System.currentTimeMillis() - t; + stream.close(); + } + + + static Soundbank soundbank; + + static Sequence sequence; + + public static InputStream getInputStream(String filename) throws IOException + { + File file = new File(System.getProperty("test.src", "."), filename); + FileInputStream fis = new FileInputStream(file); + return new BufferedInputStream(fis); + } + + public static void main(String[] args) throws Exception { + + InputStream sb = getInputStream("ding.sf2"); + soundbank = MidiSystem.getSoundbank(sb); + sb.close(); + + InputStream si = getInputStream("expresso.mid"); + sequence = MidiSystem.getSequence(si); + si.close(); + + AudioFormat format; + Map info = new HashMap(); + { + format = new AudioFormat(22050, 16, 2, true, false); + test(format, info); + format = new AudioFormat(44100, 16, 2, true, false); + test(format, info); + } + { + format = new AudioFormat(44100, 8, 2, true, false); + test(format, info); + format = new AudioFormat(44100, 16, 2, true, false); + test(format, info); + format = new AudioFormat(44100, 24, 2, true, false); + test(format, info); + } + { + format = new AudioFormat(44100, 16, 1, true, false); + test(format, info); + format = new AudioFormat(44100, 16, 2, true, false); + test(format, info); + } + { + format = new AudioFormat(44100, 16, 2, true, false); + + info.clear(); + info.put("control rate", 100f); + test(format, info); + info.clear(); + info.put("control rate", 147f); + test(format, info); + + } + { + format = new AudioFormat(44100, 16, 2, true, false); + + info.clear(); + info.put("interpolation", "point"); + test(format, info); + info.clear(); + info.put("interpolation", "linear"); + test(format, info); + info.clear(); + info.put("interpolation", "cubic"); + test(format, info); + } + { + format = new AudioFormat(44100, 16, 2, true, false); + info.clear(); + info.put("max polyphony", 4); + test(format, info); + info.clear(); + info.put("max polyphony", 16); + test(format, info); + info.clear(); + + } + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadAllInstruments.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadAllInstruments.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,69 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer unloadAllInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class UnloadAllInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + assertTrue(synth.getAvailableInstruments().length == 0); + synth.loadAllInstruments(defsbk); + assertTrue(synth.getLoadedInstruments().length != 0); + synth.unloadAllInstruments(defsbk); + assertTrue(synth.getLoadedInstruments().length == 0); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstrument.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstrument.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer unloadInstrument method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class UnloadInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 1); + synth.unloadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 0); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstruments.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstruments.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer unloadInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class UnloadInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 1); + synth.unloadInstruments(sbk, new Patch[] {ins2.getPatch()}); + assertTrue(synth.getLoadedInstruments().length == 0); + } + synth.close(); + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ding.sf2 Binary file jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ding.sf2 has changed diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/expresso.mid Binary file jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/expresso.mid has changed diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/GetName.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetName.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning getName method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetName { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + tuning.setName("custom"); + assertEquals(tuning.getName(), "custom"); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuning.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuning.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning getTuning method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetTuning { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuningInt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuningInt.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,53 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning getTuning(int) method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetTuningInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + assertTrue(Math.abs(tuning.getTuning(36)-3600) < 0.00001); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load1.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load1.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,101 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load1 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning.shtml + // 0x01 BULK TUNING DUMP + SoftTuning tuning = new SoftTuning(); + byte[] name; + name = "Testing123 ".getBytes("ascii"); + + int[] msg = new int[24+3*128]; + int[] head = {0xf0,0x7e,0x7f,0x08,0x01,0x00}; + int ox = 0; + for (int i = 0; i < head.length; i++) + msg[ox++] = head[i]; + for (int i = 0; i < name.length; i++) + msg[ox++] = name[i]; + for (int i = 0; i < 128; i++) { + msg[ox++] = i; + msg[ox++] = 64; + msg[ox++] = 0; + } + + // Calc checksum + int x = msg[1] & 0xFF; // 7E + x = x ^ (msg[2] & 0xFF); // + x = x ^ (msg[4] & 0xFF); // nn + x = x ^ (msg[5] & 0xFF); // tt + for (int i = 22; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[ox++] = (x & 127); + + msg[ox++] = 0xf7; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + + tuning.load(bmsg); + assertEquals(tuning.getName(), "Testing123 "); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + 50)) < 0.00001); + + // Check if tuning fails if checksum is wrong + /* + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + */ + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load2.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,71 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load2 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning.shtml + // 0x02 SINGLE NOTE TUNING CHANGE (REAL-TIME) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x02,0x10,0x02, + 36,36,64,0, + 40,70,0,0, + 0xf7}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + if(i == 36) + assertTrue(Math.abs(tunings[i]-3650)< 0.00001); + else if(i == 40) + assertTrue(Math.abs(tunings[i]-7000) < 0.00001); + else + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load4.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load4.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load4 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x04 KEY-BASED TUNING DUMP + SoftTuning tuning = new SoftTuning(); + byte[] name; + name = "Testing123 ".getBytes("ascii"); + + int[] msg = new int[25+3*128]; + int[] head = {0xf0,0x7e,0x7f,0x08,0x04,0x00,0x00}; + int ox = 0; + for (int i = 0; i < head.length; i++) + msg[ox++] = head[i]; + for (int i = 0; i < name.length; i++) + msg[ox++] = name[i]; + for (int i = 0; i < 128; i++) { + msg[ox++] = i; + msg[ox++] = 64; + msg[ox++] = 0; + } + + // Calc checksum + int x = msg[1] & 0xFF; + for (int i = 2; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[ox++] = (x & 127); + + msg[ox++] = 0xf7; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + + tuning.load(bmsg); + assertEquals(tuning.getName(), "Testing123 "); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + 50)) < 0.00001); + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load5.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load5.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,87 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load5 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x05 SCALE/OCTAVE TUNING DUMP, 1 byte format + SoftTuning tuning = new SoftTuning(); + + byte[] name; + name = "Testing123 ".getBytes("ascii"); + int[] msg = {0xf0,0x7e,0x7f,0x08,0x05,0,0, + name[0],name[1],name[2],name[3],name[4],name[5],name[6], + name[7],name[8],name[9],name[10],name[11],name[12],name[13], + name[14],name[15], + 5,10,15,20,25,30,35,40,45,50,51,52,0, + 0xf7}; + // Calc checksum + int x = msg[1] & 0xFF; + for (int i = 2; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[msg.length-2] = (x & 127); + + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load6.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load6.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load6 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x06 SCALE/OCTAVE TUNING DUMP, 2 byte format + SoftTuning tuning = new SoftTuning(); + + byte[] name; + name = "Testing123 ".getBytes("ascii"); + int[] msg = {0xf0,0x7e,0x7f,0x08,0x06,0,0, + name[0],name[1],name[2],name[3],name[4],name[5],name[6], + name[7],name[8],name[9],name[10],name[11],name[12],name[13], + name[14],name[15], + 5,10,15,20,25,30,35,40,45,50,51,52, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0,0xf7}; + // Calc checksum + int x = msg[1] & 0xFF; + for (int i = 2; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[msg.length-2] = (x & 127); + + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52,5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + { + double c = (oct[(i%12)*2]*128 + oct[(i%12)*2+1] -8192)*(100.0/8192.0); + assertTrue(Math.abs(tunings[i]-(i*100 + (c))) < 0.00001); + } + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load7.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load7.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load7 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x07 SINGLE NOTE TUNING CHANGE (NON REAL-TIME) (BANK) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x07,0x00,0x00,0x02, + 36,36,64,0, + 40,70,0,0, + 0xf7}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + if(i == 36) + assertTrue(Math.abs(tunings[i]-3650)< 0.00001); + else if(i == 40) + assertTrue(Math.abs(tunings[i]-7000) < 0.00001); + else + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load8.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load8.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load8 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning-scale.shtml + // 0x08 scale/octave tuning 1-byte form (Non Real-Time/REAL-TIME) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x08,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/Load9.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load9.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,69 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load9 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning-scale.shtml + // 0x09 scale/octave tuning 2-byte form (Non Real-Time/REAL-TIME) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x09,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52,5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + { + double c = (oct[(i%12)*2]*128 + oct[(i%12)*2+1] -8192)*(100.0/8192.0); + assertTrue(Math.abs(tunings[i]-(i*100 + (c))) < 0.00001); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuning.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuning.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuning { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningByteArray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningByteArray.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuningByteArray { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // RealTime: Scale/Octave tuning in 1-byte format + int[] msg = {0xf0,0x7f,0x7f,0x08,0x08,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + SoftTuning tuning = new SoftTuning(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatch.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatch.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuningPatch { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(new Patch(8,32)); + assertEquals(tuning.getPatch().getProgram(), 32); + assertEquals(tuning.getPatch().getBank(), 8); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatchByteArray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatchByteArray.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuningPatchByteArray { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // RealTime: Scale/Octave tuning in 1-byte format + int[] msg = {0xf0,0x7f,0x7f,0x08,0x08,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + SoftTuning tuning = new SoftTuning(new Patch(8,32),bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + assertEquals(tuning.getPatch().getProgram(), 32); + assertEquals(tuning.getPatch().getBank(), 8); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/swing/JColorChooser/Test4222508.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JColorChooser/Test4222508.html Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,9 @@ + + +Use the check box above the color chooser to disable it. +You could not choose a color using by the disable color chooser. + + + + + diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/swing/JColorChooser/Test4222508.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JColorChooser/Test4222508.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4222508 + * @summary Tests the color chooser disabling + * @author Sergey Malenkov + * @run applet/manual=yesno Test4222508.html + */ + +import java.awt.BorderLayout; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import javax.swing.JApplet; +import javax.swing.JCheckBox; +import javax.swing.JColorChooser; + +public final class Test4222508 extends JApplet implements ItemListener { + + private JCheckBox checkbox; + private JColorChooser chooser; + + @Override + public void init() { + this.chooser = new JColorChooser(); + this.checkbox = new JCheckBox("Enable the color chooser below", true); + this.checkbox.addItemListener(this); + add(BorderLayout.NORTH, this.checkbox); + add(BorderLayout.CENTER, this.chooser); + } + + public void itemStateChanged(ItemEvent event) { + this.chooser.setEnabled(this.checkbox.isSelected()); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/swing/JFileChooser/6698013/bug6698013.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.html Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,8 @@ + + + +1. Go into 'subdir' folder via double click +2. Return to parent directory +3. Go into 'subdir' folder: select 'subdir' folder and press the 'Open' button + + diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/swing/JFileChooser/6698013/bug6698013.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,174 @@ +/* @test %W% %E% + @bug 6698013 + @summary JFileChooser can no longer navigate non-local file systems. + @author Pavel Porvatov + @run applet/manual=done bug6698013.html +*/ + +import javax.swing.*; +import javax.swing.filechooser.FileSystemView; +import java.io.File; + +public class bug6698013 extends JApplet { + + final static VirtualFile root = new VirtualFile("testdir", true); + + final static VirtualFile rootFile = new VirtualFile("testdir/test.txt", false); + + final static VirtualFile subdir = new VirtualFile("testdir/subdir", true); + + final static VirtualFile subdirFile = new VirtualFile("testdir/subdir/subtest.txt", false); + + public static void main(String[] args) { + JFileChooser chooser = new JFileChooser(new VirtualFileSystemView()); + chooser.setCurrentDirectory(root); + chooser.showSaveDialog(null); + } + + public void init() { + JFileChooser chooser = new JFileChooser(new VirtualFileSystemView()); + chooser.setCurrentDirectory(root); + chooser.showSaveDialog(null); + } +} + +class VirtualFileSystemView extends FileSystemView { + + public boolean isRoot(File dir) { + return bug6698013.root.equals(dir); + } + + public File createNewFolder(File dir) { + return null; + } + + public File[] getRoots() { + return new File[]{bug6698013.root}; + } + + public boolean isDrive(File dir) { + return false; + } + + public boolean isFloppyDrive(File dir) { + return false; + } + + public File getParentDirectory(File dir) { + if (dir == null) { + return null; + } + + return new VirtualFile(dir.getPath(), true).getParentFile(); + } + + public File[] getFiles(File dir, boolean hide_hidden) { + if (dir.equals(bug6698013.root)) { + return new File[]{bug6698013.rootFile, bug6698013.subdir}; + } + + if (dir.equals(bug6698013.subdir)) { + return new File[]{bug6698013.subdirFile}; + } + + return null; + } + + public File getHomeDirectory() { + return bug6698013.root; + } + + public File getDefaultDirectory() { + return getHomeDirectory(); + } + + public String getSystemDisplayName(File file) { + return file.getName(); + } + + public Boolean isTraversable(File file) { + return Boolean.valueOf(file.isDirectory()); + } +} + +/** + * A Virtual File. Contains a path and a directory flag that + * represents the location of a virtual file to be contained in the + * Virtual FileSystemView. + */ +class VirtualFile extends File { + + private static final long serialVersionUID = 0L; + + private String path; + + private boolean directory; + + public VirtualFile(String path, boolean directory) { + super(path); + this.path = path; + this.directory = directory; + } + + public File getParentFile() { + int index = path.lastIndexOf('/'); + + if (index == -1) { + return null; + } + + return new VirtualFile(path.substring(0, index), true); + } + + public File getCanonicalFile() { + return this; + } + + public String getParent() { + File parent_file = getParentFile(); + + return parent_file == null ? null : parent_file.getPath(); + } + + public String getName() { + int index = path.lastIndexOf('/'); + + return index == -1 ? path : path.substring(index + 1); + } + + public String getPath() { + return path; + } + + public String getAbsolutePath() { + return path; + } + + public String getCanonicalPath() { + return path; + } + + public String toString() { + return path; + } + + public boolean equals(Object obj) { + return obj instanceof VirtualFile && path.equals(obj.toString()); + } + + public int hashCode() { + return path.hashCode(); + } + + public boolean canWrite() { + return true; + } + + public boolean isDirectory() { + return directory; + } + + public boolean exists() { + return true; + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/javax/swing/JSlider/6794836/bug6794836.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JSlider/6794836/bug6794836.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,80 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6794836 + * @summary BasicSliderUI throws NullPointerExc when JSlider maximum is Integer.MAX_VALUE + * @author Pavel Porvatov + * @run main bug6794836 + */ + +import javax.swing.*; +import javax.swing.plaf.basic.BasicSliderUI; +import java.lang.reflect.Method; +import java.util.Hashtable; + +public class bug6794836 { + public static void main(String[] args) throws Exception { + new bug6794836().run(); + } + + public void run() throws Exception { + JSlider slider = new JSlider(0, Integer.MAX_VALUE); + + slider.setPaintLabels(true); + + JLabel minLabel = new JLabel("Min"); + JLabel maxLabel = new JLabel("Max"); + + Hashtable labelTable = new Hashtable(); + + labelTable.put(Integer.MIN_VALUE, minLabel); + labelTable.put(Integer.MAX_VALUE, maxLabel); + + slider.setLabelTable(labelTable); + + BasicSliderUI ui = (BasicSliderUI) slider.getUI(); + + if (invokeMethod("getHighestValueLabel", ui) != maxLabel) { + fail("invalid getHighestValueLabel result"); + } + + if (invokeMethod("getLowestValueLabel", ui) != minLabel) { + fail("invalid getLowestValueLabel result"); + } + + System.out.println("The bug6794836 test passed"); + } + + private static Object invokeMethod(String name, BasicSliderUI ui) throws Exception { + Method method = BasicSliderUI.class.getDeclaredMethod(name, null); + + method.setAccessible(true); + + return method.invoke(ui, null); + } + + private static void fail(String s) { + throw new RuntimeException("Test failed: " + s); + } +} diff -r d3de53b2070d -r 34c52e8a097b jdk/test/sun/text/resources/LocaleData --- a/jdk/test/sun/text/resources/LocaleData Fri Jan 30 23:27:20 2009 -0800 +++ b/jdk/test/sun/text/resources/LocaleData Thu Feb 05 09:24:45 2009 -0800 @@ -5518,3 +5518,11 @@ FormatData/sv/AmPmMarkers/0=fm FormatData/sv/AmPmMarkers/1=em +# JE, GG, IM (6544471) +LocaleNames//JE=Jersey +LocaleNames//GG=Guernsey +LocaleNames//IM=Isle Of Man + +# BL, MF (6627549) +LocaleNames//BL=Saint Barth\u00e9lemy +LocaleNames//MF=Saint Martin diff -r d3de53b2070d -r 34c52e8a097b langtools/.hgtags --- a/langtools/.hgtags Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/.hgtags Thu Feb 05 09:24:45 2009 -0800 @@ -19,3 +19,4 @@ 5e5567c2db56a931cf07768218c20903d9828b5f jdk7-b42 e2f8f6daee9decd5721d598dacf4d0b5915651df jdk7-b43 28f0b10d6c1afc106465c13b8c663a6afa4fb1a1 jdk7-b44 +30db5e0aaf83fe262d9a7227d3fc3e451cd5d459 jdk7-b45 diff -r d3de53b2070d -r 34c52e8a097b langtools/make/README --- a/langtools/make/README Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/make/README Thu Feb 05 09:24:45 2009 -0800 @@ -15,7 +15,7 @@ System Requirements: Ant: version 1.6.5 or later - NetBeans: version 5.0 or later (optional) + NetBeans: version 6.0 or later (optional) JDK: currently version 1.5.0, although 1.6.0 is recommended OS: any system supporting the above tools diff -r d3de53b2070d -r 34c52e8a097b langtools/make/build.properties --- a/langtools/make/build.properties Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/make/build.properties Thu Feb 05 09:24:45 2009 -0800 @@ -66,7 +66,7 @@ # set the following to -version to verify the versions of javac being used javac.version.opt = # in time, there should be no exceptions to -Xlint:all -javac.lint.opts = -Xlint:all,-deprecation,-fallthrough,-serial,-unchecked,-cast +javac.lint.opts = -Xlint:all -Werror # options for the task for javac javadoc.jls3.url=http://java.sun.com/docs/books/jls/ diff -r d3de53b2070d -r 34c52e8a097b langtools/make/build.xml --- a/langtools/make/build.xml Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/make/build.xml Thu Feb 05 09:24:45 2009 -0800 @@ -392,6 +392,7 @@ + @@ -433,6 +434,7 @@ + @@ -471,6 +473,7 @@ + @@ -493,6 +496,7 @@ destdir="@{gensrc.dir}" includes="**/*.properties"/> - - + diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/README --- a/langtools/make/netbeans/README Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/make/netbeans/README Thu Feb 05 09:24:45 2009 -0800 @@ -1,28 +1,39 @@ -Working on the "langtools" workspace using NetBeans. +Using NetBeans to work on the langtools repository. + +Netbeans 6.0 or later is recommended. -This directory (make/netbeans) contains NetBeans projects that -allow you to work on the various tools using the NetBeans IDE. +The "langtools" project in this directory allows you to +edit, run, test and debug the tools in the OpenJDK langtools +repository. -NetBeans 5.0 or later is required and sufficient to use these -projects. This is different from other projects in OpenJDK, -which requires version 6.0 or later. +The repository contains a number of tools: + apt, javac, javadoc and its doclets, javah and javap. + +Build Properties. -The following projects are provided: +To build this repository, you must set some properties for Ant. +You can set these properties in a number of ways: + +- Set the properties in the Properties panel under Tool> Options> Ant. + Properties set this way will apply globally to all the langtools + repositories you may be working on. -compiler: for working on the compiler, javac -javadoc: for working on the documentation tool, javadoc -doclets: for working on the standard doclets used by the - documentation tool, javadoc -javah: for working on the C header tool, javah -javap: for working on the disassembler, javap -apt: for working on the annotation processing tool, apt. - Note that this is just provided for completeness; - the tool has been superceded by new features in javac, - and work on apt itself is discouraged. +- Create a file build.properties in the root directory of a + langtools repository, and set the properties in that file. + These properties will be specific to that repository. + +To build the repository, at a minimum you must set the "boot.java.home" +property. To run the tools, you must also set "target.java.home". To +run the regression tests, you must set "jtreg.home". -However, any tool can be worked on from any project; the only difference -between these projects is the behavior of the standard NetBeans actions, -so that "Build" in the compiler project will build the compiler, etc. +By default, the build and test targets will build and test all +of these tools. The run and debug targets will prompt you for the +name of a tool to execute. - - +As an alternative, you can focus on a single tool. When you do +this, you will still see all the source code for all the tools, +but the various Ant targets will now be focussed on the selected tool. +To focus on a tool, bring up the context menu on the "langtools" +project (i.e. right-click on the project) and select "Select Tool". +This brings up a dialog which allows you to specify which tool you +wish to work on, and the arguments to use if and when you run it. diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/apt/README --- a/langtools/make/netbeans/apt/README Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -"apt" project README. - -This project is for working on the annotation processing tool (apt) -in the OpenJDK langtools component. - -The tool was provided in Java 1.5, but has been superceded by new -features in the compiler (javac) in Java 6. apt itself is now -deprecated, and any further devlopment on it is strongly discouraged. - -The main class for the tool is com.sun.tools.apt.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/apt/build.xml --- a/langtools/make/netbeans/apt/build.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/apt/nbproject/project.xml --- a/langtools/make/netbeans/apt/nbproject/project.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - apt - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/common/shared.xml --- a/langtools/make/netbeans/common/shared.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - - Must set property 'includes' - - - - - - - - - - - - - Must set property 'run.classname' - - - - - - - - Some tests failed; see report for details. - - - - - - - - - - - - - Must set property 'debug.classname' - - - - - - - - Must set property 'jtreg.tests' - - - - - - - - Must set property 'class' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/common/standard-context-menu-items-no-javadoc.ent --- a/langtools/make/netbeans/common/standard-context-menu-items-no-javadoc.ent Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/common/standard-context-menu-items.ent --- a/langtools/make/netbeans/common/standard-context-menu-items.ent Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent --- a/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ - - - - - - - build - - - - clean - - - - clean - build - - - - compile-single - ${root}/src/share/classes - - includes - ${root}/src/share/classes - \.java$ - relative-path - - , - - - - - - run - - - - run-single - - run.classname - ${root}/src/share/classes - \.java$ - java-name - - - - - - - - - - jtreg - - jtreg.tests - ${root}/test - \.(java|sh)$ - relative-path - - , - - - - - - jtreg - - - - debug-nb - - - - debug-single-nb - - debug.classname - ${root}/src/share/classes - \.java$ - java-name - - - - - - - - - - debug-jtreg-nb - - jtreg.tests - ${root}/test - \.(java|sh)$ - relative-path - - - - - - - - debug-fix - ${root}/src/share/classes - - class - ${root}/src/share/classes - \.java$ - relative-path-noext - - - - - - - - -javadoc-nb - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/common/standard-ide-actions.ent --- a/langtools/make/netbeans/common/standard-ide-actions.ent Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ - - - - - - - build - - - - clean - - - - clean - build - - - - compile-single - ${root}/src/share/classes - - includes - ${root}/src/share/classes - \.java$ - relative-path - - , - - - - - - run - - - - run-single - - run.classname - ${root}/src/share/classes - \.java$ - java-name - - - - - - - - - - jtreg - - jtreg.tests - ${root}/test - \.(java|sh)$ - relative-path - - , - - - - - - jtreg - - - - debug-nb - - - - debug-single-nb - - debug.classname - ${root}/src/share/classes - \.java$ - java-name - - - - - - - - - - debug-jtreg-nb - - jtreg.tests - ${root}/test - \.(java|sh)$ - relative-path - - - - - - - - debug-fix - ${root}/src/share/classes - - class - ${root}/src/share/classes - \.java$ - relative-path-noext - - - - - - - - -javadoc-nb - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/compiler/README --- a/langtools/make/netbeans/compiler/README Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -"compiler" project README. - -This project is for working on the compiler tool (javac) -in the OpenJDK langtools component. - -The main class for the tool is com.sun.tools.javac.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/compiler/build.xml --- a/langtools/make/netbeans/compiler/build.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/compiler/nbproject/project.xml --- a/langtools/make/netbeans/compiler/nbproject/project.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - compiler - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/doclets/README --- a/langtools/make/netbeans/doclets/README Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -"doclets" project README. - -This project is for working on the standard doclets used by -the documentation tool (javadoc) in the OpenJDK langtools component. - -The doclets are invoked as part of the documentation tool (javadoc). -Using this project, you can also browse javadoc and any tools in langtools. -If you build the doclets, javadoc will be built automatically as well, -if necessary. - -The doclets are found in com.sun.tools.doclets. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/doclets/build.xml --- a/langtools/make/netbeans/doclets/build.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/doclets/nbproject/project.xml --- a/langtools/make/netbeans/doclets/nbproject/project.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - doclets - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javadoc/README --- a/langtools/make/netbeans/javadoc/README Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -"javadoc" project README. - -This project is for working on the documentation tool (javadoc) -in the OpenJDK langtools component. - -javadoc is built on top of the compiler (javac). Using this -project, you can also browse javac and any tools in langtools. -If you build javadoc, javac will be built automatically as well, -if necessary. - -The main class for the tool is com.sun.tools.javadoc.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javadoc/build.xml --- a/langtools/make/netbeans/javadoc/build.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javadoc/nbproject/project.xml --- a/langtools/make/netbeans/javadoc/nbproject/project.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - javadoc - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javah/README --- a/langtools/make/netbeans/javah/README Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -"javah" project README. - -This project is for working on the native header tool (javah) -in the OpenJDK langtools component. - -javah is built on top of the documentation tool (javadoc). Using this -project, you can also browse javadoc and any other tools in langtools. -If you build javah, javadoc will be built automatically as well, -if necessary. - -javah is in the process of being converted so that it runs directly on -top of the compiler, javac, using the annotation processing API, -instead of on top of the documentation tool, javadoc, using the -Doclet API. - -The main class for the tool is com.sun.tools.javah.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javah/build.xml --- a/langtools/make/netbeans/javah/build.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javah/nbproject/project.xml --- a/langtools/make/netbeans/javah/nbproject/project.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - javah - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javap/README --- a/langtools/make/netbeans/javap/README Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -"javap" project README. - -This project is for working on the disassembler tool (javap) -in the OpenJDK langtools component. - -The main class for the tool is sun.tools.javap.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javap/build.xml --- a/langtools/make/netbeans/javap/build.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/javap/nbproject/project.xml --- a/langtools/make/netbeans/javap/nbproject/project.xml Fri Jan 30 23:27:20 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - javap - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/langtools/build.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/netbeans/langtools/build.xml Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set property 'includes' + + + + + + + + + + + + + + Must set property 'run.classname' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Some tests failed; see report for details. + + + + + + + + + + + + + Must set property 'debug.classname' + + + + + + + Must set property 'jtreg.tests' + + + + + + + + Must set property 'class' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/langtools/nbproject/project.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/netbeans/langtools/nbproject/project.xml Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,108 @@ + + + + + +]> + + org.netbeans.modules.ant.freeform + + + + langtools + + ../../.. + + + + + ${root} + + + + java + ${root}/src/share/classes + + + + tests + ${root}/test + + + + build + ${root}/make + + + + &standard-ide-actions; + + + folder + ${root}/build/classes + build + + + + + + ${root}/src/share/classes + + + + ${root}/test + + + + ${root}/make + + + + README + + + + &standard-context-menu-items; + + + + + + + ${root}/src/share/classes + ${root}/build/classes + 1.5 + + + + diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/langtools/nbproject/standard-context-menu-items.ent --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/netbeans/langtools/nbproject/standard-context-menu-items.ent Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + diff -r d3de53b2070d -r 34c52e8a097b langtools/make/netbeans/langtools/nbproject/standard-ide-actions.ent --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/netbeans/langtools/nbproject/standard-ide-actions.ent Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,173 @@ + + + + + + + build + + + + clean + + + + clean + build + + + + compile-single + ${root}/src/share/classes + + includes + ${root}/src/share/classes + \.java$ + relative-path + + , + + + + + + run + + + + run-single + + run.classname + ${root}/src/share/classes + \.java$ + java-name + + + + + + + + + + jtreg + + jtreg.tests + ${root}/test + \.(java|sh)$ + relative-path + + , + + + + + + jtreg + + + + debug + + + + debug-single + + debug.classname + ${root}/src/share/classes + \.java$ + java-name + + + + + + + + + + debug-jtreg + + jtreg.tests + ${root}/test + \.(java|sh)$ + relative-path + + + + + + + + debug-fix + ${root}/src/share/classes + + class + ${root}/src/share/classes + \.java$ + relative-path-noext + + + + + + + + javadoc + + + + select-tool + + + + test-select-tool-1 + + + + test-select-tool-2 + diff -r d3de53b2070d -r 34c52e8a097b langtools/make/tools/SelectTool/SelectToolTask.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/make/tools/SelectTool/SelectToolTask.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,284 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import javax.swing.SwingUtilities; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; + +/** + * Task to allow the user to control langtools tools built when using NetBeans. + * + * There are two primary modes. + * 1) Property mode. In this mode, property names are provided to get values + * that may be specified by the user, either directly in a GUI dialog, or + * read from a properties file. If the GUI dialog is invoked, values may + * optionally be set for future use. + * 2) Setup mode. In this mode, no property names are provided, and the GUI + * is invoked to allow the user to set or reset values for use in property mode. + */ +public class SelectToolTask extends Task { + /** + * Set the location of the private properties file used to keep the retain + * user preferences for this repository. + */ + public void setPropertyFile(File propertyFile) { + this.propertyFile = propertyFile; + } + + /** + * Set the name of the property which will be set to the name of the + * selected tool, if any. If no tool is selected, the property will + * remain unset. + */ + public void setToolProperty(String toolProperty) { + this.toolProperty = toolProperty; + } + + /** + * Set the name of the property which will be set to the execution args of the + * selected tool, if any. The args default to an empty string. + */ + public void setArgsProperty(String argsProperty) { + this.argsProperty = argsProperty; + } + + /** + * Specify whether or not to pop up a dialog if the user has not specified + * a default value for a property. + */ + public void setAskIfUnset(boolean askIfUnset) { + this.askIfUnset = askIfUnset; + } + + @Override + public void execute() { + Project p = getProject(); + + Properties props = readProperties(propertyFile); + toolName = props.getProperty("tool.name"); + if (toolName != null) { + toolArgs = props.getProperty(toolName + ".args", ""); + } + + if (toolProperty == null || + askIfUnset && (toolName == null + || (argsProperty != null && toolArgs == null))) { + showGUI(props); + } + + // finally, return required values, if any + if (toolProperty != null && !(toolName == null || toolName.equals(""))) { + p.setProperty(toolProperty, toolName); + + if (argsProperty != null && toolArgs != null) + p.setProperty(argsProperty, toolArgs); + } + } + + void showGUI(Properties fileProps) { + Properties guiProps = new Properties(fileProps); + JOptionPane p = createPane(guiProps); + p.createDialog("Select Tool").setVisible(true); + + toolName = (String) toolChoice.getSelectedItem(); + toolArgs = argsField.getText(); + + if (defaultCheck.isSelected()) { + if (toolName.equals("")) { + fileProps.remove("tool.name"); + } else { + fileProps.put("tool.name", toolName); + fileProps.put(toolName + ".args", toolArgs); + } + writeProperties(propertyFile, fileProps); + } + } + + JOptionPane createPane(final Properties props) { + JPanel body = new JPanel(new GridBagLayout()); + GridBagConstraints lc = new GridBagConstraints(); + lc.insets.right = 10; + lc.insets.bottom = 3; + GridBagConstraints fc = new GridBagConstraints(); + fc.anchor = GridBagConstraints.WEST; + fc.gridx = 1; + fc.gridwidth = GridBagConstraints.REMAINDER; + fc.insets.bottom = 3; + + JLabel toolLabel = new JLabel("Tool:"); + body.add(toolLabel, lc); + String[] toolChoices = { "apt", "javac", "javadoc", "javah", "javap" }; + if (true || toolProperty == null) { + // include empty value in setup mode + List l = new ArrayList(Arrays.asList(toolChoices)); + l.add(0, ""); + toolChoices = l.toArray(new String[l.size()]); + } + toolChoice = new JComboBox(toolChoices); + if (toolName != null) + toolChoice.setSelectedItem(toolName); + toolChoice.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + String tn = (String) e.getItem(); + argsField.setText(getDefaultArgsForTool(props, tn)); + if (toolProperty != null) + okButton.setEnabled(!tn.equals("")); + } + }); + body.add(toolChoice, fc); + + argsField = new JTextField(getDefaultArgsForTool(props, toolName), 40); + if (toolProperty == null || argsProperty != null) { + JLabel argsLabel = new JLabel("Args:"); + body.add(argsLabel, lc); + body.add(argsField, fc); + argsField.addFocusListener(new FocusListener() { + public void focusGained(FocusEvent e) { + } + public void focusLost(FocusEvent e) { + String toolName = (String) toolChoice.getSelectedItem(); + if (toolName.length() > 0) + props.put(toolName + ".args", argsField.getText()); + } + }); + } + + defaultCheck = new JCheckBox("Set as default"); + if (toolProperty == null) + defaultCheck.setSelected(true); + else + body.add(defaultCheck, fc); + + final JOptionPane p = new JOptionPane(body); + okButton = new JButton("OK"); + okButton.setEnabled(toolProperty == null || (toolName != null && !toolName.equals(""))); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JDialog d = (JDialog) SwingUtilities.getAncestorOfClass(JDialog.class, p); + d.setVisible(false); + } + }); + p.setOptions(new Object[] { okButton }); + + return p; + } + + Properties readProperties(File file) { + Properties p = new Properties(); + if (file != null && file.exists()) { + Reader in = null; + try { + in = new BufferedReader(new FileReader(file)); + p.load(in); + in.close(); + } catch (IOException e) { + throw new BuildException("error reading property file", e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + throw new BuildException("cannot close property file", e); + } + } + } + } + return p; + } + + void writeProperties(File file, Properties p) { + if (file != null) { + Writer out = null; + try { + File dir = file.getParentFile(); + if (dir != null && !dir.exists()) + dir.mkdirs(); + out = new BufferedWriter(new FileWriter(file)); + p.store(out, "langtools properties"); + out.close(); + } catch (IOException e) { + throw new BuildException("error writing property file", e); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + throw new BuildException("cannot close property file", e); + } + } + } + } + } + + String getDefaultArgsForTool(Properties props, String tn) { + return (tn == null || tn.equals("")) ? "" : props.getProperty(tn + ".args", ""); + } + + // Ant task parameters + private boolean askIfUnset; + private String toolProperty; + private String argsProperty; + private File propertyFile; + + // GUI components + private JComboBox toolChoice; + private JTextField argsField; + private JCheckBox defaultCheck; + private JButton okButton; + + // Result values for the client + private String toolName; + private String toolArgs; +} diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/apt/comp/AnnotationProcessingError.java --- a/langtools/src/share/classes/com/sun/tools/apt/comp/AnnotationProcessingError.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/comp/AnnotationProcessingError.java Thu Feb 05 09:24:45 2009 -0800 @@ -26,6 +26,7 @@ package com.sun.tools.apt.comp; public class AnnotationProcessingError extends Error { + private static final long serialVersionUID = 3279196183341719287L; AnnotationProcessingError(Throwable cause) { super(cause); } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java --- a/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java Thu Feb 05 09:24:45 2009 -0800 @@ -316,8 +316,13 @@ } providers = list.iterator(); - } else - providers = sun.misc.Service.providers(AnnotationProcessorFactory.class, aptCL); + } else { + @SuppressWarnings("unchecked") + Iterator iter = + sun.misc.Service.providers(AnnotationProcessorFactory.class, aptCL); + providers = iter; + + } } java.util.Map> factoryToAnnotation = diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/apt/comp/UsageMessageNeededException.java --- a/langtools/src/share/classes/com/sun/tools/apt/comp/UsageMessageNeededException.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/comp/UsageMessageNeededException.java Thu Feb 05 09:24:45 2009 -0800 @@ -26,4 +26,6 @@ package com.sun.tools.apt.comp; -public class UsageMessageNeededException extends RuntimeException {} +public class UsageMessageNeededException extends RuntimeException { + private static final long serialVersionUID = -3265159608992825840L; +} diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/apt/main/JavaCompiler.java --- a/langtools/src/share/classes/com/sun/tools/apt/main/JavaCompiler.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/main/JavaCompiler.java Thu Feb 05 09:24:45 2009 -0800 @@ -233,6 +233,7 @@ ListBuffer classes = new ListBuffer(); try { + JavacFileManager fm = (JavacFileManager)fileManager; //parse all files ListBuffer trees = new ListBuffer(); for (List l = filenames; l.nonEmpty(); l = l.tail) { @@ -250,7 +251,8 @@ continue; } } - trees.append(parse(l.head)); + JavaFileObject fo = fm.getJavaFileObjectsFromStrings(List.of(l.head)).iterator().next(); + trees.append(parse(fo)); } //enter symbols for all files diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -30,6 +30,8 @@ import com.sun.mirror.apt.RoundState; public class RoundCompleteEventImpl extends RoundCompleteEvent { + private static final long serialVersionUID = 7067621446720784300L; + public RoundCompleteEventImpl(AnnotationProcessorEnvironment source, RoundState rs) { super(source, rs); diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java Thu Feb 05 09:24:45 2009 -0800 @@ -252,6 +252,7 @@ */ private void typeMismatch(final Method method, final Attribute attr) { value = new ExceptionProxy() { + private static final long serialVersionUID = 8473323277815075163L; public String toString() { return ""; // eg: @Anno(value=) } @@ -270,6 +271,7 @@ * type. */ private static class MirroredTypeExceptionProxy extends ExceptionProxy { + private static final long serialVersionUID = 6662035281599933545L; private MirroredTypeException ex; @@ -311,6 +313,7 @@ * types. */ private static class MirroredTypesExceptionProxy extends ExceptionProxy { + private static final long serialVersionUID = -6670822532616693951L; private MirroredTypesException ex; diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -64,7 +64,7 @@ * {@inheritDoc} */ public TypeParameterDeclaration getDeclaration() { - TypeSymbol sym = (TypeSymbol) type.tsym; + TypeSymbol sym = type.tsym; return env.declMaker.getTypeParameterDeclaration(sym); } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/Annotation.java --- a/langtools/src/share/classes/com/sun/tools/classfile/Annotation.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/Annotation.java Thu Feb 05 09:24:45 2009 -0800 @@ -37,6 +37,7 @@ */ public class Annotation { static class InvalidAnnotation extends AttributeException { + private static final long serialVersionUID = -4620480740735772708L; InvalidAnnotation(String msg) { super(msg); } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/AttributeException.java --- a/langtools/src/share/classes/com/sun/tools/classfile/AttributeException.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/AttributeException.java Thu Feb 05 09:24:45 2009 -0800 @@ -32,6 +32,7 @@ * deletion without notice. */ public class AttributeException extends Exception { + private static final long serialVersionUID = -4231486387714867770L; AttributeException() { } AttributeException(String msg) { diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java --- a/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java Thu Feb 05 09:24:45 2009 -0800 @@ -37,6 +37,7 @@ */ public class Code_attribute extends Attribute { public class InvalidIndex extends AttributeException { + private static final long serialVersionUID = -8904527774589382802L; InvalidIndex(int index) { this.index = index; } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java --- a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java Thu Feb 05 09:24:45 2009 -0800 @@ -38,6 +38,7 @@ public class ConstantPool { public class InvalidIndex extends ConstantPoolException { + private static final long serialVersionUID = -4350294289300939730L; InvalidIndex(int index) { super(index); } @@ -50,6 +51,7 @@ } public class UnexpectedEntry extends ConstantPoolException { + private static final long serialVersionUID = 6986335935377933211L; UnexpectedEntry(int index, int expected_tag, int found_tag) { super(index); this.expected_tag = expected_tag; @@ -67,6 +69,7 @@ } public class InvalidEntry extends ConstantPoolException { + private static final long serialVersionUID = 1000087545585204447L; InvalidEntry(int index, int tag) { super(index); this.tag = tag; @@ -82,6 +85,7 @@ } public class EntryNotFound extends ConstantPoolException { + private static final long serialVersionUID = 2885537606468581850L; EntryNotFound(Object value) { super(-1); this.value = value; diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/ConstantPoolException.java --- a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPoolException.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPoolException.java Thu Feb 05 09:24:45 2009 -0800 @@ -33,6 +33,7 @@ * deletion without notice. */ public class ConstantPoolException extends Exception { + private static final long serialVersionUID = -2324397349644754565L; ConstantPoolException(int index) { this.index = index; } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java --- a/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java Thu Feb 05 09:24:45 2009 -0800 @@ -38,6 +38,7 @@ */ public class Descriptor { public class InvalidDescriptor extends DescriptorException { + private static final long serialVersionUID = 1L; InvalidDescriptor(String desc) { this.desc = desc; this.index = -1; diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/DescriptorException.java --- a/langtools/src/share/classes/com/sun/tools/classfile/DescriptorException.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/DescriptorException.java Thu Feb 05 09:24:45 2009 -0800 @@ -33,4 +33,5 @@ * deletion without notice. */ public class DescriptorException extends Exception { + private static final long serialVersionUID = 2411890273788901032L; } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java --- a/langtools/src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java Thu Feb 05 09:24:45 2009 -0800 @@ -37,6 +37,7 @@ */ public class StackMapTable_attribute extends Attribute { static class InvalidStackMap extends AttributeException { + private static final long serialVersionUID = -5659038410855089780L; InvalidStackMap(String msg) { super(msg); } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -493,4 +493,14 @@ public Comparator getMemberComparator() { return null; } + + /** + * {@inheritDoc} + */ + public Locale getLocale() { + if (root instanceof com.sun.tools.javadoc.RootDocImpl) + return ((com.sun.tools.javadoc.RootDocImpl)root).getLocale(); + else + return Locale.getDefault(); + } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java Thu Feb 05 09:24:45 2009 -0800 @@ -119,7 +119,7 @@ */ protected void generateIndex() { for (int i = 0; i < groupList.size(); i++) { - String groupname = (String)groupList.get(i); + String groupname = groupList.get(i); List list = groupPackageMap.get(groupname); if (list != null && list.size() > 0) { printIndexContents(list.toArray(new PackageDoc[list.size()]), diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,12 +25,11 @@ package com.sun.tools.doclets.formats.html.markup; -import com.sun.tools.doclets.internal.toolkit.*; +import java.io.*; +import java.util.*; import com.sun.javadoc.*; -import java.io.*; -import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; +import com.sun.tools.doclets.internal.toolkit.*; /** @@ -56,8 +55,9 @@ super(configuration, null, configuration.destDirName + filename, configuration.docencoding); + // use File to normalize file separators configuration.message.notice("doclet.Generating_0", - configuration.destDirName + filename); + new File(configuration.destDirName, filename)); } public HtmlDocWriter(Configuration configuration, @@ -65,10 +65,10 @@ super(configuration, configuration.destDirName + path, filename, configuration.docencoding); + // use File to normalize file separators configuration.message.notice("doclet.Generating_0", - configuration.destDirName + - ((path.length() > 0)? - path + File.separator: "") + filename); + new File(configuration.destDirName, + ((path.length() > 0)? path + File.separator: "") + filename)); } /** diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Thu Feb 05 09:24:45 2009 -0800 @@ -85,7 +85,7 @@ * Print <HTML> tag. Add a newline character at the end. */ public void html() { - println(""); + println(""); } /** diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java Thu Feb 05 09:24:45 2009 -0800 @@ -707,6 +707,11 @@ } /** + * Return the Locale for this document. + */ + public abstract Locale getLocale(); + + /** * Return the comparator that will be used to sort member documentation. * To no do any sorting, return null. * diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java Thu Feb 05 09:24:45 2009 -0800 @@ -402,7 +402,7 @@ public void buildFieldSerializationOverview(ClassDoc classDoc) { if (classDoc.definesSerializableFields()) { FieldDoc serialPersistentField = - (FieldDoc)((Util.asList(classDoc.serializableFields()).get(0))); + Util.asList(classDoc.serializableFields()).get(0); String comment = serialPersistentField.commentText(); if (comment.length() > 0) { fieldWriter.writeHeader( diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java Thu Feb 05 09:24:45 2009 -0800 @@ -26,6 +26,7 @@ package com.sun.tools.doclets.internal.toolkit.util; public class DocletAbortException extends RuntimeException { + private static final long serialVersionUID = -9131058909576418984L; public DocletAbortException() { } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java Thu Feb 05 09:24:45 2009 -0800 @@ -81,46 +81,14 @@ } /** - * get and format message string from resource - * - * @param key selects message from resource - */ - public String getText(String key) { - return getText(key, (String)null); - } - - /** * Get and format message string from resource * * @param key selects message from resource - * @param a1 Argument, to be repalced in the message. - */ - public String getText(String key, String a1) { - return getText(key, a1, null); - } - - /** - * Get and format message string from resource - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public String getText(String key, String a1, String a2) { - return getText(key, a1, a2, null); - } - - /** - * Get and format message string from resource - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. + * @param args arguments to be replaced in the message. * @throws MissingResourceException when the key does not * exist in the properties file. */ - public String getText(String key, String a1, String a2, String a3) throws MissingResourceException { + public String getText(String key, Object... args) throws MissingResourceException { if (messageRB == null) { try { messageRB = ResourceBundle.getBundle(resourcelocation); @@ -130,7 +98,7 @@ } } String message = messageRB.getString(key); - return MessageFormat.format(message, a1, a2, a3); + return MessageFormat.format(message, args); } /** @@ -195,127 +163,20 @@ * * @param pos the position of the source * @param key selects message from resource - */ - public void error(SourcePosition pos, String key) { - printError(pos, getText(key)); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - */ - public void error(String key) { - printError(getText(key)); - } - - /** - * Print error message, increment error count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. + * @param args arguments to be replaced in the message. */ - public void error(SourcePosition pos, String key, String a1) { - printError(pos, getText(key, a1)); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void error(String key, String a1) { - printError(getText(key, a1)); - } - - /** - * Print error message, increment error count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void error(SourcePosition pos, String key, String a1, String a2) { - printError(pos, getText(key, a1, a2)); + public void error(SourcePosition pos, String key, Object... args) { + printError(pos, getText(key, args)); } /** * Print error message, increment error count. * * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void error(String key, String a1, String a2) { - printError(getText(key, a1, a2)); - } - - /** - * Print error message, increment error count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void error(SourcePosition pos, String key, String a1, String a2, String a3) { - printError(pos, getText(key, a1, a2, a3)); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. + * @param args arguments to be replaced in the message. */ - public void error(String key, String a1, String a2, String a3) { - printError(getText(key, a1, a2, a3)); - } - - /** - * Print warning message, increment warning count. - * - * @param pos the position of the source - * @param key selects message from resource - */ - public void warning(SourcePosition pos, String key) { - printWarning(pos, getText(key)); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - */ - public void warning(String key) { - printWarning(getText(key)); - } - - /** - * Print warning message, increment warning count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void warning(SourcePosition pos, String key, String a1) { - printWarning(pos, getText(key, a1)); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void warning(String key, String a1) { - printWarning(getText(key, a1)); + public void error(String key, Object... args) { + printError(getText(key, args)); } /** @@ -323,47 +184,20 @@ * * @param pos the position of the source * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. + * @param args arguments to be replaced in the message. */ - public void warning(SourcePosition pos, String key, String a1, String a2) { - printWarning(pos, getText(key, a1, a2)); + public void warning(SourcePosition pos, String key, Object... args) { + printWarning(pos, getText(key, args)); } /** * Print warning message, increment warning count. * * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. + * @param args arguments to be replaced in the message. */ - public void warning(String key, String a1, String a2) { - printWarning(getText(key, a1, a2)); - } - - /** - * Print warning message, increment warning count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void warning(SourcePosition pos, String key, String a1, String a2, String a3) { - printWarning(pos, getText(key, a1, a2, a3)); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void warning(String key, String a1, String a2, String a3) { - printWarning(getText(key, a1, a2, a3)); + public void warning(String key, Object... args) { + printWarning(getText(key, args)); } /** @@ -371,85 +205,19 @@ * * @param pos the position of the source * @param key selects message from resource - */ - public void notice(SourcePosition pos, String key) { - printNotice(pos, getText(key)); - } - - /** - * Print a message. - * - * @param key selects message from resource + * @param args arguments to be replaced in the message. */ - public void notice(String key) { - printNotice(getText(key)); - } - - /** - * Print a message. - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void notice(SourcePosition pos, String key, String a1) { - printNotice(pos, getText(key, a1)); + public void notice(SourcePosition pos, String key, Object... args) { + printNotice(pos, getText(key, args)); } /** * Print a message. * * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void notice(String key, String a1) { - printNotice(getText(key, a1)); - } - - /** - * Print a message. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void notice(SourcePosition pos, String key, String a1, String a2) { - printNotice(pos, getText(key, a1, a2)); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. + * @param args arguments to be replaced in the message. */ - public void notice(String key, String a1, String a2) { - printNotice(getText(key, a1, a2)); - } - - /** - * Print a message. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void notice(SourcePosition pos, String key, String a1, String a2, String a3) { - printNotice(pos, getText(key, a1, a2, a3)); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void notice(String key, String a1, String a2, String a3) { - printNotice(getText(key, a1, a2, a3)); + public void notice(String key, Object... args) { + printNotice(getText(key, args)); } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,10 +25,12 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.io.*; import java.util.*; +import javax.tools.FileObject; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; /** * Converts Java Source Code to HTML. @@ -123,16 +125,27 @@ if (cd == null || outputdir == null) { return; } - File file; - SourcePosition sp = cd.position(); - if (sp == null || (file = sp.file()) == null) { - return; - } try { + SourcePosition sp = cd.position(); + if (sp == null) + return; + Reader r; + // temp hack until we can update SourcePosition API. + if (sp instanceof com.sun.tools.javadoc.SourcePositionImpl) { + FileObject fo = ((com.sun.tools.javadoc.SourcePositionImpl) sp).fileObject(); + if (fo == null) + return; + r = fo.openReader(true); + } else { + File file = sp.file(); + if (file == null) + return; + r = new FileReader(file); + } + LineNumberReader reader = new LineNumberReader(r); int lineno = 1; String line; StringBuffer output = new StringBuffer(); - LineNumberReader reader = new LineNumberReader(new FileReader(file)); try { while ((line = reader.readLine()) != null) { output.append(formatLine(line, configuration.sourcetab, lineno)); @@ -142,7 +155,7 @@ reader.close(); } output = addLineNumbers(output.toString()); - output.insert(0, getHeader()); + output.insert(0, getHeader(configuration)); output.append(getFooter()); writeToFile(output.toString(), outputdir, cd.name(), configuration); } catch (Exception e){ @@ -192,10 +205,11 @@ /** * Get the header. + * @param configuration the Doclet configuration * @return the header to the output file */ - protected static String getHeader() { - StringBuffer result = new StringBuffer("" + DocletConstants.NL); + protected static String getHeader(Configuration configuration) { + StringBuffer result = new StringBuffer("" + DocletConstants.NL); result.append("" + DocletConstants.NL); result.append("
    " + DocletConstants.NL);
             return result.toString();
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
    --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -25,10 +25,11 @@
     
     package com.sun.tools.doclets.internal.toolkit.util;
     
    +import java.io.*;
    +import java.util.*;
    +
     import com.sun.javadoc.*;
     import com.sun.tools.doclets.internal.toolkit.*;
    -import java.util.*;
    -import java.io.*;
     
     /**
      * Utilities Class for Doclets.
    @@ -579,7 +580,7 @@
          * @param docencoding Encoding to be used for this file.
          * @exception IOException Exception raised by the FileWriter is passed on
          * to next level.
    -     * @exception UnSupportedEncodingException Exception raised by the
    +     * @exception UnsupportedEncodingException Exception raised by the
          * OutputStreamWriter is passed on to next level.
          * @return Writer Writer for the file getting generated.
          * @see java.io.FileOutputStream
    @@ -598,9 +599,7 @@
                 fos = new FileOutputStream(filename);
             }
             if (docencoding == null) {
    -            OutputStreamWriter oswriter = new OutputStreamWriter(fos);
    -            docencoding = oswriter.getEncoding();
    -            return oswriter;
    +            return new OutputStreamWriter(fos);
             } else {
                 return new OutputStreamWriter(fos, docencoding);
             }
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javac/code/Types.java
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javac/comp/Check.java
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
    --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -471,6 +471,7 @@
             private int value;
         };
         protected class CompileStates extends HashMap,CompileState> {
    +        private static final long serialVersionUID = 1812267524140424433L;
             boolean isDone(Env env, CompileState cs) {
                 CompileState ecs = get(env);
                 return ecs != null && ecs.isDone(cs);
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javac/main/Main.java
    --- a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -338,13 +338,13 @@
                     return EXIT_CMDERR;
                 }
     
    -            List filenames;
    +            List files;
                 try {
    -                filenames = processArgs(CommandLine.parse(args));
    -                if (filenames == null) {
    +                files = processArgs(CommandLine.parse(args));
    +                if (files == null) {
                         // null signals an error in options, abort
                         return EXIT_CMDERR;
    -                } else if (filenames.isEmpty() && fileObjects.isEmpty() && classnames.isEmpty()) {
    +                } else if (files.isEmpty() && fileObjects.isEmpty() && classnames.isEmpty()) {
                         // it is allowed to compile nothing if just asking for help or version info
                         if (options.get("-help") != null
                             || options.get("-X") != null
    @@ -380,12 +380,14 @@
                 comp = JavaCompiler.instance(context);
                 if (comp == null) return EXIT_SYSERR;
     
    -            if (!filenames.isEmpty()) {
    +            Log log = Log.instance(context);
    +
    +            if (!files.isEmpty()) {
                     // add filenames to fileObjects
                     comp = JavaCompiler.instance(context);
                     List otherFiles = List.nil();
                     JavacFileManager dfm = (JavacFileManager)fileManager;
    -                for (JavaFileObject fo : dfm.getJavaFileObjectsFromFiles(filenames))
    +                for (JavaFileObject fo : dfm.getJavaFileObjectsFromFiles(files))
                         otherFiles = otherFiles.prepend(fo);
                     for (JavaFileObject fo : otherFiles)
                         fileObjects = fileObjects.prepend(fo);
    @@ -394,6 +396,16 @@
                              classnames.toList(),
                              processors);
     
    +            if (log.expectDiagKeys != null) {
    +                if (log.expectDiagKeys.size() == 0) {
    +                    Log.printLines(log.noticeWriter, "all expected diagnostics found");
    +                    return EXIT_OK;
    +                } else {
    +                    Log.printLines(log.noticeWriter, "expected diagnostic keys not found: " + log.expectDiagKeys);
    +                    return EXIT_ERROR;
    +                }
    +            }
    +
                 if (comp.errorCount() != 0 ||
                     options.get("-Werror") != null && comp.warningCount() != 0)
                     return EXIT_ERROR;
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
    --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -863,13 +863,13 @@
                             accept(GT);
                             t = F.at(pos1).TypeApply(t, args.toList());
                             checkGenerics();
    -                        t = bracketsOpt(toP(t));
                             while (S.token() == DOT) {
                                 S.nextToken();
                                 mode = TYPE;
                                 t = toP(F.at(S.pos()).Select(t, ident()));
                                 t = typeArgumentsOpt(t);
                             }
    +                        t = bracketsOpt(toP(t));
                         } else if ((mode & EXPR) != 0) {
                             mode = EXPR;
                             t = F.at(pos1).Binary(op, t, term2Rest(t1, TreeInfo.shiftPrec));
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java
    --- a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -61,6 +61,7 @@
          * @param opts list of command-line options
          * @param msgs JavacMessages object used for i18n
          */
    +    @SuppressWarnings("fallthrough")
         BasicDiagnosticFormatter(Options opts, JavacMessages msgs) {
             super(msgs, opts, true);
             initAvailableFormats();
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javac/util/Log.java
    --- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -26,6 +26,7 @@
     package com.sun.tools.javac.util;
     
     import java.io.*;
    +import java.util.Arrays;
     import java.util.HashSet;
     import java.util.Map;
     import java.util.Set;
    @@ -97,6 +98,11 @@
         private DiagnosticFormatter diagFormatter;
     
         /**
    +     * Keys for expected diagnostics
    +     */
    +    public Set expectDiagKeys;
    +
    +    /**
          * JavacMessages object used for localization
          */
         private JavacMessages messages;
    @@ -123,9 +129,13 @@
             this.diagFormatter = rawDiagnostics ? new RawDiagnosticFormatter(options) :
                                                   new BasicDiagnosticFormatter(options, messages);
             @SuppressWarnings("unchecked") // FIXME
    -        DiagnosticListener diagListener =
    +        DiagnosticListener dl =
                 context.get(DiagnosticListener.class);
    -        this.diagListener = diagListener;
    +        this.diagListener = dl;
    +
    +        String ek = options.get("expectKeys");
    +        if (ek != null)
    +            expectDiagKeys = new HashSet(Arrays.asList(ek.split(", *")));
         }
         // where
             private int getIntOption(Options options, String optionName, int defaultValue) {
    @@ -291,6 +301,9 @@
          * reported so far, the diagnostic may be handed off to writeDiagnostic.
          */
         public void report(JCDiagnostic diagnostic) {
    +        if (expectDiagKeys != null)
    +            expectDiagKeys.remove(diagnostic.getCode());
    +
             switch (diagnostic.getType()) {
             case FRAGMENT:
                 throw new IllegalArgumentException();
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java
    --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -25,42 +25,48 @@
     
     package com.sun.tools.javadoc;
     
    +import java.io.File;
    +import java.io.IOException;
    +import java.lang.reflect.Modifier;
    +import java.net.URI;
    +import java.util.HashSet;
    +import java.util.Set;
    +import javax.tools.FileObject;
    +import javax.tools.JavaFileManager.Location;
    +import javax.tools.StandardJavaFileManager;
    +import javax.tools.StandardLocation;
    +
     import com.sun.javadoc.*;
     
     import static com.sun.javadoc.LanguageVersion.*;
     
    -import com.sun.tools.javac.util.List;
    -import com.sun.tools.javac.util.ListBuffer;
    -import com.sun.tools.javac.util.Name;
    -import com.sun.tools.javac.util.Position;
    -
     import com.sun.tools.javac.code.Flags;
     import com.sun.tools.javac.code.Kinds;
    -import com.sun.tools.javac.code.TypeTags;
    -import com.sun.tools.javac.code.Type;
    -import com.sun.tools.javac.code.Type.ClassType;
     import com.sun.tools.javac.code.Scope;
     import com.sun.tools.javac.code.Symbol;
     import com.sun.tools.javac.code.Symbol.*;
    +import com.sun.tools.javac.code.Type;
    +import com.sun.tools.javac.code.Type.ClassType;
    +import com.sun.tools.javac.code.TypeTags;
     
     import com.sun.tools.javac.comp.AttrContext;
     import com.sun.tools.javac.comp.Env;
     
     import com.sun.tools.javac.tree.JCTree;
    +import com.sun.tools.javac.tree.JCTree.JCClassDecl;
     import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
     import com.sun.tools.javac.tree.JCTree.JCImport;
    -import com.sun.tools.javac.tree.JCTree.JCClassDecl;
     import com.sun.tools.javac.tree.TreeInfo;
     
    +import com.sun.tools.javac.util.List;
    +import com.sun.tools.javac.util.ListBuffer;
    +import com.sun.tools.javac.util.Name;
     import com.sun.tools.javac.util.Names;
    +import com.sun.tools.javac.util.Position;
    +
     import static com.sun.tools.javac.code.Flags.*;
     import static com.sun.tools.javac.code.Kinds.*;
     
    -import java.io.File;
    -import java.util.Set;
    -import java.util.HashSet;
    -import java.lang.reflect.Modifier;
    -
     /**
      * Represents a java class and provides access to information
      * about the class, the class' comment and tags, and the
    @@ -271,16 +277,41 @@
          */
         public PackageDoc containingPackage() {
             PackageDocImpl p = env.getPackageDoc(tsym.packge());
    -        SourcePosition po = position();
    -        if (po != null && p.setDocPath == false && p.zipDocPath == null) {
    -            //Set the package path if possible
    -            File packageDir = po.file().getParentFile();
    -            if (packageDir != null
    -                && (new File(packageDir, "package.html")).exists()) {
    -                p.setDocPath(packageDir.getPath());
    -            } else {
    -                p.setDocPath(null);
    +        if (p.setDocPath == false) {
    +            FileObject docPath;
    +            try {
    +                Location location = env.fileManager.hasLocation(StandardLocation.SOURCE_PATH)
    +                    ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH;
    +
    +                docPath = env.fileManager.getFileForInput(
    +                        location, p.qualifiedName(), "package.html");
    +            } catch (IOException e) {
    +                docPath = null;
                 }
    +
    +            if (docPath == null) {
    +                // fall back on older semantics of looking in same directory as
    +                // source file for this class
    +                SourcePosition po = position();
    +                if (env.fileManager instanceof StandardJavaFileManager &&
    +                        po instanceof SourcePositionImpl) {
    +                    URI uri = ((SourcePositionImpl) po).filename.toUri();
    +                    if ("file".equals(uri.getScheme())) {
    +                        File f = new File(uri.getPath());
    +                        File dir = f.getParentFile();
    +                        if (dir != null) {
    +                            File pf = new File(dir, "package.html");
    +                            if (pf.exists()) {
    +                                StandardJavaFileManager sfm = (StandardJavaFileManager) env.fileManager;
    +                                docPath = sfm.getJavaFileObjects(pf).iterator().next();
    +                            }
    +                        }
    +
    +                    }
    +                }
    +            }
    +
    +            p.setDocPath(docPath);
             }
             return p;
         }
    @@ -1251,7 +1282,7 @@
          */
         public SourcePosition position() {
             if (tsym.sourcefile == null) return null;
    -        return SourcePositionImpl.make(tsym.sourcefile.toString(),
    +        return SourcePositionImpl.make(tsym.sourcefile,
                                            (tree==null) ? Position.NOPOS : tree.pos,
                                            lineMap);
         }
    diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/Comment.java
    --- a/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java	Fri Jan 30 23:27:20 2009 -0800
    +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java	Thu Feb 05 09:24:45 2009 -0800
    @@ -74,6 +74,7 @@
              * the tag text.
              * 
    */ + @SuppressWarnings("fallthrough") class CommentStringParser { /** * The entry point to the comment string parser diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,8 +25,9 @@ package com.sun.tools.javadoc; +import java.lang.reflect.Modifier; import java.util.*; -import java.lang.reflect.Modifier; +import javax.tools.JavaFileManager; import com.sun.javadoc.*; @@ -40,7 +41,6 @@ import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Position; - /** * Holds the environment for a run of javadoc. * Holds only the information needed throughout the @@ -103,6 +103,7 @@ Check chk; Types types; + JavaFileManager fileManager; /** Allow documenting from class files? */ boolean docClasses = false; @@ -133,6 +134,7 @@ externalizableSym = reader.enterClass(names.fromString("java.io.Externalizable")); chk = Check.instance(context); types = Types.instance(context); + fileManager = context.get(JavaFileManager.class); // Default. Should normally be reset with setLocale. this.doclocale = new DocLocale(this, "", breakiterator); diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,11 +25,13 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; - import java.io.InputStream; import java.io.IOException; import java.text.CollationKey; +import javax.tools.FileObject; + +import com.sun.javadoc.*; + import com.sun.tools.javac.util.Position; /** @@ -43,7 +45,7 @@ * @author Atul M Dambalkar * @author Neal Gafter (rewrite) */ -abstract class DocImpl implements Doc, Comparable { +public abstract class DocImpl implements Doc, Comparable { /** * Doc environment @@ -163,7 +165,7 @@ /** * Utility for subclasses which read HTML documentation files. */ - String readHTMLDocumentation(InputStream input, String filename) throws IOException { + String readHTMLDocumentation(InputStream input, FileObject filename) throws IOException { int filesize = input.available(); byte[] filecontents = new byte[filesize]; input.read(filecontents, 0, filesize); diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,20 +25,18 @@ package com.sun.tools.javadoc; +import java.lang.reflect.Modifier; +import java.text.CollationKey; + import com.sun.javadoc.*; +import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Position; -import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.Type; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.tree.JCTree.JCMethodDecl; - -import java.text.CollationKey; - -import java.lang.reflect.Modifier; /** * Represents a method or constructor of a java class. @@ -267,7 +265,7 @@ */ public SourcePosition position() { if (sym.enclClass().sourcefile == null) return null; - return SourcePositionImpl.make(sym.enclClass().sourcefile.toString(), + return SourcePositionImpl.make(sym.enclClass().sourcefile, (tree==null) ? 0 : tree.pos, lineMap); } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,6 +25,8 @@ package com.sun.tools.javadoc; +import java.lang.reflect.Modifier; + import com.sun.javadoc.*; import static com.sun.javadoc.LanguageVersion.*; @@ -38,9 +40,6 @@ import com.sun.tools.javac.util.Position; -import java.lang.reflect.Modifier; - - /** * Represents a field in a java class. * @@ -260,7 +259,7 @@ */ public SourcePosition position() { if (sym.enclClass().sourcefile == null) return null; - return SourcePositionImpl.make(sym.enclClass().sourcefile.toString(), + return SourcePositionImpl.make(sym.enclClass().sourcefile, (tree==null) ? 0 : tree.pos, lineMap); } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,18 +25,13 @@ package com.sun.tools.javadoc; +import java.util.EnumSet; +import javax.tools.JavaFileObject; + import com.sun.tools.javac.code.Symbol.PackageSymbol; -import com.sun.tools.javac.file.JavacFileManager; -import com.sun.tools.javac.file.ZipArchive.ZipFileObject; -import com.sun.tools.javac.file.Old199; -import com.sun.tools.javac.file.ZipFileIndexArchive; import com.sun.tools.javac.jvm.ClassReader; import com.sun.tools.javac.util.Context; -import java.io.File; -import java.util.EnumSet; -import javax.tools.JavaFileObject; - /** Javadoc uses an extended class reader that records package.html entries * @author Neal Gafter */ @@ -82,32 +77,7 @@ */ @Override protected void extraFileActions(PackageSymbol pack, JavaFileObject fo) { - CharSequence fileName = Old199.getName(fo); - if (docenv != null && fileName.equals("package.html")) { - if (fo instanceof ZipFileObject) { - ZipFileObject zfo = (ZipFileObject) fo; - String zipName = zfo.getZipName(); - String entryName = zfo.getZipEntryName(); - int lastSep = entryName.lastIndexOf("/"); - String classPathName = entryName.substring(0, lastSep + 1); - docenv.getPackageDoc(pack).setDocPath(zipName, classPathName); - } - else if (fo instanceof ZipFileIndexArchive.ZipFileIndexFileObject) { - ZipFileIndexArchive.ZipFileIndexFileObject zfo = (ZipFileIndexArchive.ZipFileIndexFileObject) fo; - String zipName = zfo.getZipName(); - String entryName = zfo.getZipEntryName(); - if (File.separatorChar != '/') { - entryName = entryName.replace(File.separatorChar, '/'); - } - - int lastSep = entryName.lastIndexOf("/"); - String classPathName = entryName.substring(0, lastSep + 1); - docenv.getPackageDoc(pack).setDocPath(zipName, classPathName); - } - else { - File fileDir = new File(Old199.getPath(fo)).getParentFile(); - docenv.getPackageDoc(pack).setDocPath(fileDir.getAbsolutePath()); - } - } + if (fo.isNameCompatible("package", JavaFileObject.Kind.HTML)) + docenv.getPackageDoc(pack).setDocPath(fo); } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,17 +25,29 @@ package com.sun.tools.javadoc; -import java.io.*; - +import java.io.File; +import java.io.IOException; import java.util.Collection; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import javax.tools.JavaFileManager.Location; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.comp.*; -import com.sun.tools.javac.file.Paths; +import com.sun.tools.javac.code.Symbol.CompletionFailure; +import com.sun.tools.javac.comp.Annotate; import com.sun.tools.javac.parser.DocCommentScanner; -import com.sun.tools.javac.tree.*; -import com.sun.tools.javac.tree.JCTree.*; -import com.sun.tools.javac.util.*; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.JCClassDecl; +import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; +import com.sun.tools.javac.util.Abort; +import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.ListBuffer; +import com.sun.tools.javac.util.Position; /** @@ -53,7 +65,6 @@ final JavadocClassReader reader; final JavadocEnter enter; final Annotate annotate; - private final Paths paths; /** * Construct a new JavaCompiler processor, using appropriately @@ -66,7 +77,6 @@ reader = JavadocClassReader.instance0(context); enter = JavadocEnter.instance0(context); annotate = Annotate.instance(context); - paths = Paths.instance(context); } /** @@ -120,7 +130,7 @@ boolean quiet) throws IOException { docenv = DocEnv.instance(context); docenv.showAccess = filter; - docenv.quiet = quiet; + docenv.quiet = quiet; docenv.breakiterator = breakiterator; docenv.setLocale(doclocale); docenv.setEncoding(encoding); @@ -133,12 +143,14 @@ ListBuffer packTrees = new ListBuffer(); try { + StandardJavaFileManager fm = (StandardJavaFileManager) docenv.fileManager; for (List it = javaNames; it.nonEmpty(); it = it.tail) { String name = it.head; if (!docClasses && name.endsWith(".java") && new File(name).exists()) { + JavaFileObject fo = fm.getJavaFileObjects(name).iterator().next(); docenv.notice("main.Loading_source_file", name); - JCCompilationUnit tree = parse(name); - classTrees.append(tree); + JCCompilationUnit tree = parse(fo); + classTrees.append(tree); } else if (isValidPackageName(name)) { names = names.append(name); } else if (name.endsWith(".java")) { @@ -151,12 +163,14 @@ if (!docClasses) { // Recursively search given subpackages. If any packages //are found, add them to the list. - searchSubPackages(subPackages, names, excludedPackages); + Map> packageFiles = + searchSubPackages(subPackages, names, excludedPackages); // Parse the packages for (List packs = names.toList(); packs.nonEmpty(); packs = packs.tail) { // Parse sources ostensibly belonging to package. - parsePackageClasses(packs.head, packTrees, excludedPackages); + String packageName = packs.head; + parsePackageClasses(packageName, packageFiles.get(packageName), packTrees, excludedPackages); } if (messager.nerrors() != 0) return null; @@ -167,7 +181,8 @@ } } catch (Abort ex) {} - if (messager.nerrors() != 0) return null; + if (messager.nerrors() != 0) + return null; if (docClasses) return new RootDocImpl(docenv, javaNames, options); @@ -185,66 +200,129 @@ return isValidClassName(s); } - - private final static char pathSep = File.pathSeparatorChar; - /** * search all directories in path for subdirectory name. Add all * .java files found in such a directory to args. */ private void parsePackageClasses(String name, - ListBuffer trees, - List excludedPackages) - throws IOException { + Iterable files, + ListBuffer trees, + List excludedPackages) + throws IOException { if (excludedPackages.contains(name)) { return; } + boolean hasFiles = false; docenv.notice("main.Loading_source_files_for_package", name); - name = name.replace('.', File.separatorChar); - for (File pathname : paths.sourceSearchPath()) { - File f = new File(pathname, name); - String names[] = f.list(); - // if names not null, then found directory with source files - if (names != null) { - String dir = f.getAbsolutePath(); - if (!dir.endsWith(File.separator)) - dir = dir + File.separator; - for (int j = 0; j < names.length; j++) { - if (isValidJavaSourceFile(names[j])) { - String fn = dir + names[j]; - // messager.notice("main.Loading_source_file", fn); - trees.append(parse(fn)); - hasFiles = true; - } + + if (files == null) { + Location location = docenv.fileManager.hasLocation(StandardLocation.SOURCE_PATH) + ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH; + ListBuffer lb = new ListBuffer(); + for (JavaFileObject fo: docenv.fileManager.list( + location, name, EnumSet.of(JavaFileObject.Kind.SOURCE), false)) { + String binaryName = docenv.fileManager.inferBinaryName(location, fo); + String simpleName = getSimpleName(binaryName); + if (isValidClassName(simpleName)) { + lb.append(fo); } } + files = lb.toList(); } - if (!hasFiles) + + for (JavaFileObject fo : files) { + // messager.notice("main.Loading_source_file", fn); + trees.append(parse(fo)); + hasFiles = true; + } + + if (!hasFiles) { messager.warning(null, "main.no_source_files_for_package", - name.replace(File.separatorChar, '.')); + name.replace(File.separatorChar, '.')); + } } /** * Recursively search all directories in path for subdirectory name. * Add all packages found in such a directory to packages list. */ + private Map> searchSubPackages( + List subPackages, + ListBuffer packages, + List excludedPackages) + throws IOException { + Map> packageFiles = + new HashMap>(); + + Map includedPackages = new HashMap(); + includedPackages.put("", true); + for (String p: excludedPackages) + includedPackages.put(p, false); + + if (docenv.fileManager.hasLocation(StandardLocation.SOURCE_PATH)) { + searchSubPackages(subPackages, + includedPackages, + packages, packageFiles, + StandardLocation.SOURCE_PATH, + EnumSet.of(JavaFileObject.Kind.SOURCE)); + searchSubPackages(subPackages, + includedPackages, + packages, packageFiles, + StandardLocation.CLASS_PATH, + EnumSet.of(JavaFileObject.Kind.CLASS)); + } else { + searchSubPackages(subPackages, + includedPackages, + packages, packageFiles, + StandardLocation.CLASS_PATH, + EnumSet.of(JavaFileObject.Kind.SOURCE, JavaFileObject.Kind.CLASS)); + } + return packageFiles; + } + private void searchSubPackages(List subPackages, - ListBuffer packages, - List excludedPackages) { - // FIXME: This search path is bogus. - // Only the effective source path should be searched for sources. - // Only the effective class path should be searched for classes. - // Should the bootclasspath/extdirs also be searched for classes? - java.util.List pathnames = new java.util.ArrayList(); - if (paths.sourcePath() != null) - for (File elt : paths.sourcePath()) - pathnames.add(elt); - for (File elt : paths.userClassPath()) - pathnames.add(elt); + Map includedPackages, + ListBuffer packages, + Map> packageFiles, + StandardLocation location, Set kinds) + throws IOException { + for (String subPackage: subPackages) { + if (!isIncluded(subPackage, includedPackages)) + continue; - for (String subPackage : subPackages) - searchSubPackage(subPackage, packages, excludedPackages, pathnames); + for (JavaFileObject fo: docenv.fileManager.list(location, subPackage, kinds, true)) { + String binaryName = docenv.fileManager.inferBinaryName(location, fo); + String packageName = getPackageName(binaryName); + String simpleName = getSimpleName(binaryName); + if (isIncluded(packageName, includedPackages) && isValidClassName(simpleName)) { + List list = packageFiles.get(packageName); + list = (list == null ? List.of(fo) : list.prepend(fo)); + packageFiles.put(packageName, list); + if (!packages.contains(packageName)) + packages.add(packageName); + } + } + } + } + + private String getPackageName(String name) { + int lastDot = name.lastIndexOf("."); + return (lastDot == -1 ? "" : name.substring(0, lastDot)); + } + + private String getSimpleName(String name) { + int lastDot = name.lastIndexOf("."); + return (lastDot == -1 ? name : name.substring(lastDot + 1)); + } + + private boolean isIncluded(String packageName, Map includedPackages) { + Boolean b = includedPackages.get(packageName); + if (b == null) { + b = isIncluded(getPackageName(packageName), includedPackages); + includedPackages.put(packageName, b); + } + return b; } /** diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/Messager.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java Thu Feb 05 09:24:45 2009 -0800 @@ -111,6 +111,7 @@ * @param warnWriter Stream for warnings * @param noticeWriter Stream for other messages */ + @SuppressWarnings("deprecation") protected Messager(Context context, String programName, PrintWriter errWriter, diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,30 +25,23 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; +import java.io.InputStream; +import java.io.IOException; +import javax.tools.FileObject; -import java.io.File; -import java.io.InputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.zip.ZipFile; -import java.util.zip.ZipEntry; +import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.PackageSymbol; -import com.sun.tools.javac.comp.AttrContext; -import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Position; -import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; - - /** * Represents a java package. Provides access to information * about the package, the package's comment and tags, and the @@ -63,14 +56,10 @@ public class PackageDocImpl extends DocImpl implements PackageDoc { - private static final String PACKAGE_HTML_FILE_NAME = "package.html"; - protected PackageSymbol sym; private JCCompilationUnit tree = null; // for source position - public String docPath = null; - public String zipDocPath = null; - public String zipDocEntry = null; + public FileObject docPath = null; private boolean foundDoc; // found a doc comment in either // package.html or package-info.java @@ -108,30 +97,16 @@ * Do lazy initialization of "documentation" string. */ String documentation() { - if (documentation != null) return documentation; - if (zipDocPath != null) { - try { - ZipFile f = new ZipFile(zipDocPath); - ZipEntry entry = f.getEntry(zipDocEntry); - if (entry != null) { - InputStream s = f.getInputStream(entry); - return (documentation = readHTMLDocumentation(s, - zipDocPath + File.separatorChar + zipDocEntry)); - } - } catch (IOException exc) { - documentation = ""; - env.error(null, "javadoc.File_Read_Error", - zipDocPath + File.separatorChar + zipDocEntry); - } - } + if (documentation != null) + return documentation; if (docPath != null) { // read from file try { - InputStream s = new FileInputStream(docPath); + InputStream s = docPath.openInputStream(); documentation = readHTMLDocumentation(s, docPath); } catch (IOException exc) { documentation = ""; - env.error(null, "javadoc.File_Read_Error", docPath); + env.error(null, "javadoc.File_Read_Error", docPath.getName()); } } else { // no doc file to be had @@ -363,24 +338,12 @@ /** * set doc path for an unzipped directory */ - public void setDocPath(String path) { + public void setDocPath(FileObject path) { setDocPath = true; if (path == null) return; - String newDocPath = path + File.separatorChar + PACKAGE_HTML_FILE_NAME; - if (!newDocPath.equals(docPath)) { - docPath = newDocPath; - checkDoc(); - } - } - - /** - * set the doc path for zipped directory - */ - public void setDocPath(String path, String entry) { - if (!path.equals(zipDocPath)) { - zipDocPath = path; - zipDocEntry = entry + PACKAGE_HTML_FILE_NAME; + if (!path.equals(docPath)) { + docPath = path; checkDoc(); } } @@ -409,7 +372,7 @@ */ public SourcePosition position() { return (tree != null) - ? SourcePositionImpl.make(tree.sourcefile + "", tree.pos, tree.lineMap) + ? SourcePositionImpl.make(tree.sourcefile, tree.pos, tree.lineMap) : SourcePositionImpl.make(docPath, Position.NOPOS, null); } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -26,13 +26,13 @@ package com.sun.tools.javadoc; import java.io.IOException; -import java.io.FileInputStream; -import java.io.File; +import java.util.Locale; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; import com.sun.javadoc.*; import com.sun.tools.javac.tree.JCTree.JCClassDecl; -import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Position; @@ -307,10 +307,13 @@ * Return the path of the overview file and null if it does not exist. * @return the path of the overview file and null if it does not exist. */ - private String getOverviewPath() { + private JavaFileObject getOverviewPath() { for (String[] opt : options) { if (opt[0].equals("-overview")) { - return opt[1]; + if (env.fileManager instanceof StandardJavaFileManager) { + StandardJavaFileManager fm = (StandardJavaFileManager) env.fileManager; + return fm.getJavaFileObjects(opt[1]).iterator().next(); + } } } return null; @@ -322,7 +325,7 @@ protected String documentation() { if (documentation == null) { int cnt = options.length(); - String overviewPath = getOverviewPath(); + JavaFileObject overviewPath = getOverviewPath(); if (overviewPath == null) { // no doc file to be had documentation = ""; @@ -330,11 +333,11 @@ // read from file try { documentation = readHTMLDocumentation( - new FileInputStream(overviewPath), + overviewPath.openInputStream(), overviewPath); } catch (IOException exc) { documentation = ""; - env.error(null, "javadoc.File_Read_Error", overviewPath); + env.error(null, "javadoc.File_Read_Error", overviewPath.getName()); } } } @@ -346,9 +349,16 @@ * no position is available. */ public SourcePosition position() { - String path; + JavaFileObject path; return ((path = getOverviewPath()) == null) ? null : SourcePositionImpl.make(path, Position.NOPOS, null); } + + /** + * Return the locale provided by the user or the default locale value. + */ + public Locale getLocale() { + return env.doclocale.locale; + } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java Thu Feb 05 09:24:45 2009 -0800 @@ -25,11 +25,12 @@ package com.sun.tools.javadoc; +import java.io.File; +import javax.tools.FileObject; + import com.sun.javadoc.SourcePosition; import com.sun.tools.javac.util.Position; -import java.io.File; - /** * A source position: filename, line number, and column number. * @@ -37,15 +38,21 @@ * @author Neal M Gafter * @author Michael Van De Vanter (position representation changed to char offsets) */ -class SourcePositionImpl implements SourcePosition { - String filename; +public class SourcePositionImpl implements SourcePosition { + FileObject filename; int position; Position.LineMap lineMap; /** The source file. Returns null if no file information is * available. */ public File file() { - return (filename == null) ? null : new File(filename); + return (filename == null) ? null : new File(filename.getName()); + } + + /** The source file. Returns null if no file information is + * available. */ + public FileObject fileObject() { + return filename; } /** The line in the source file. The first line is numbered 1; @@ -71,7 +78,7 @@ } } - private SourcePositionImpl(String file, int position, + private SourcePositionImpl(FileObject file, int position, Position.LineMap lineMap) { super(); this.filename = file; @@ -79,16 +86,27 @@ this.lineMap = lineMap; } - public static SourcePosition make(String file, int pos, + public static SourcePosition make(FileObject file, int pos, Position.LineMap lineMap) { if (file == null) return null; return new SourcePositionImpl(file, pos, lineMap); } public String toString() { + // Backwards compatibility hack. ZipFileObjects use the format + // zipfile(zipentry) but javadoc has been using zipfile/zipentry + String fn = filename.toString(); + if (fn.endsWith(")")) { + int paren = fn.lastIndexOf("("); + if (paren != -1) + fn = fn.substring(0, paren) + + File.separatorChar + + fn.substring(paren + 1, fn.length() - 1); + } + if (position == Position.NOPOS) - return filename; + return fn; else - return filename + ":" + line(); + return fn + ":" + line(); } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java Thu Feb 05 09:24:45 2009 -0800 @@ -51,6 +51,7 @@ * @param errToClassDoc if true, ERROR type results in a ClassDoc; * false preserves legacy behavior */ + @SuppressWarnings("fallthrough") public static com.sun.javadoc.Type getType(DocEnv env, Type t, boolean errToClassDoc) { if (env.legacyDoclet) { diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javah/Gen.java --- a/langtools/src/share/classes/com/sun/tools/javah/Gen.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javah/Gen.java Thu Feb 05 09:24:45 2009 -0800 @@ -342,6 +342,6 @@ fields.addAll(Arrays.asList(cd.fields())); } - return (FieldDoc[]) fields.toArray(new FieldDoc[fields.size()]); + return fields.toArray(new FieldDoc[fields.size()]); } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/com/sun/tools/javap/InternalError.java --- a/langtools/src/share/classes/com/sun/tools/javap/InternalError.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javap/InternalError.java Thu Feb 05 09:24:45 2009 -0800 @@ -32,6 +32,7 @@ * deletion without notice. */ public class InternalError extends Error { + private static final long serialVersionUID = 8114054446416187030L; InternalError(Throwable t, Object... args) { super("Internal error", t); this.args = args; diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,8 @@ package javax.lang.model.type; - +import java.io.ObjectInputStream; +import java.io.IOException; import java.lang.annotation.Annotation; import javax.lang.model.element.Element; @@ -67,4 +68,13 @@ public TypeMirror getTypeMirror() { return type; } + + /** + * Explicitly set all transient fields. + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + type = null; + } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java Thu Feb 05 09:24:45 2009 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,12 @@ package javax.lang.model.type; - import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; import java.util.Collections; - +import java.io.ObjectInputStream; +import java.io.IOException; import javax.lang.model.element.Element; @@ -49,8 +49,7 @@ private static final long serialVersionUID = 269; - // Should this be non-final for a custum readObject method? - private final transient List types; // cannot be serialized + private transient List types; // cannot be serialized /** * Constructs a new MirroredTypesException for the specified types. @@ -58,7 +57,9 @@ * @param types the types being accessed */ public MirroredTypesException(List types) { - super("Attempt to access Class objects for TypeMirrors " + types); + super("Attempt to access Class objects for TypeMirrors " + + (types = // defensive copy + new ArrayList(types)).toString() ); this.types = Collections.unmodifiableList(types); } @@ -72,4 +73,13 @@ public List getTypeMirrors() { return types; } + + /** + * Explicitly set all transient fields. + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + types = null; + } } diff -r d3de53b2070d -r 34c52e8a097b langtools/src/share/classes/sun/tools/javap/JavapPrinter.java --- a/langtools/src/share/classes/sun/tools/javap/JavapPrinter.java Fri Jan 30 23:27:20 2009 -0800 +++ b/langtools/src/share/classes/sun/tools/javap/JavapPrinter.java Thu Feb 05 09:24:45 2009 -0800 @@ -719,6 +719,7 @@ /** * Print constant pool entry information. */ + @SuppressWarnings("fallthrough") public int PrintlnConstantEntry(int cpx) { int size=1; byte tag=0; @@ -757,6 +758,7 @@ case CONSTANT_LONG: case CONSTANT_DOUBLE: size=2; + // fall through default: out.println(str+";"); } diff -r d3de53b2070d -r 34c52e8a097b langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,93 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6786682 + * @summary This test verifies the use of lang attribute by . + * @author Bhavesh Patel + * @library ../lib/ + * @build JavadocTester + * @build TestHtmlTag + * @run main TestHtmlTag + */ + +import java.util.Locale; + +public class TestHtmlTag extends JavadocTester { + + private static final String BUG_ID = "6786682"; + private static final String[][] TEST1 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", ""}}; + private static final String[][] NEGATED_TEST1 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}}; + private static final String[][] TEST2 = { + {BUG_ID + FS + "pkg2" + FS + "C2.html", ""}, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", ""}}; + private static final String[][] NEGATED_TEST2 = { + {BUG_ID + FS + "pkg2" + FS + "C2.html", ""}}; + private static final String[][] TEST3 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", ""}}; + private static final String[][] NEGATED_TEST3 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}}; + + private static final String[] ARGS1 = + new String[] { + "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"}; + private static final String[] ARGS2 = + new String[] { + "-locale", "ja", "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg2"}; + private static final String[] ARGS3 = + new String[] { + "-locale", "en_US", "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"}; + + /** + * The entry point of the test. + * @param args the array of command line arguments. + */ + public static void main(String[] args) { + TestHtmlTag tester = new TestHtmlTag(); + run(tester, ARGS1, TEST1, NEGATED_TEST1); + run(tester, ARGS2, TEST2, NEGATED_TEST2); + run(tester, ARGS3, TEST3, NEGATED_TEST3); + tester.printSummary(); + } + + /** + * {@inheritDoc} + */ + public String getBugId() { + return BUG_ID; + } + + /** + * {@inheritDoc} + */ + public String getBugName() { + return getClass().getName(); + } +} diff -r d3de53b2070d -r 34c52e8a097b langtools/test/com/sun/javadoc/testHtmlTag/pkg1/C1.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/com/sun/javadoc/testHtmlTag/pkg1/C1.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,33 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package pkg1; + +public class C1 { + + public void method(int param1, int param2) { + + } +} diff -r d3de53b2070d -r 34c52e8a097b langtools/test/com/sun/javadoc/testHtmlTag/pkg2/C2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/com/sun/javadoc/testHtmlTag/pkg2/C2.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,31 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package pkg2; + +/** + * Comments: Class 2 + */ +public class C2 {} diff -r d3de53b2070d -r 34c52e8a097b langtools/test/tools/javac/T6794959.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T6794959.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,36 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6794959 + * @summary add new switch -XDexpectKeys=key,key,... + * @compile T6794959.java + * @compile/fail -XDfailcomplete=java.lang.String T6794959.java + * @compile -XDfailcomplete=java.lang.String -XDexpectKeys=compiler.err.cant.resolve.location T6794959.java + * @compile/fail -XDexpectKeys=compiler.err.cant.resolve.location T6794959.java + */ + +class T6794959 { + String s; +} diff -r d3de53b2070d -r 34c52e8a097b langtools/test/tools/javac/cast/6795580/T6795580.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/cast/6795580/T6795580.java Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,80 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @author Maurizio Cimadamore + * @bug 6795580 + * @summary parser confused by square brackets in qualified generic cast + * @compile/fail/ref=T6795580.out -XDrawDiagnostics T6795580.java + */ + +class T6795580 { + class Outer { + class Inner {} + } + + void cast1(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast2(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast3(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast4(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast5(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast6(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast7(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast8(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast9(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast10(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast11(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } +} \ No newline at end of file diff -r d3de53b2070d -r 34c52e8a097b langtools/test/tools/javac/cast/6795580/T6795580.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/cast/6795580/T6795580.out Thu Feb 05 09:24:45 2009 -0800 @@ -0,0 +1,8 @@ +T6795580.java:54:57: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:58:60: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:62:67: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:66:59: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:70:62: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:74:57: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:78:60: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +7 errors