[Audio-engine-dev] Updating Gervill for OpenJDK 6 build 12

Joe Darcy Joe.Darcy at Sun.COM
Tue Jul 22 15:53:44 PDT 2008


Hello.

With my OpenJDK 6 release manager hat on, I've been working to update 
the version of Gervill used to OpenJDK 6 to a newer version that passes 
the JCK tests, etc. and I'd like some review of my integration work.  
Before this exercise, I don't have any prior experience with sound code.

A few comments, the copyright header in file SoftCubicResampler.java in 
the Gervill CVS master contains the typo "suabject" instead of 
"subject."  From some casual examination of the code, it seems to use 
raw types throughout, that is "List" rather than "List<String>", etc.  
It would be better to covert to using generics; I think IDEs have 
refactorings to help this now.

There are some differences between the latest Gervill CVS from the 
project's site and the Gervill overlays in IcedTea 6.  In particular, 
IcedTea has changes to SoftMixingMixer.java and SoftSynthesizer.java as 
well as some additional files, WaveExtensibleFileReader.java and 
WaveFloatFileWriter.java.  I'd prefer to limit future merging work 
between the three code bases, Gervill CVS, OpenJDK 6, and IcedTea 
overlays, so in the context of updating Gervill for OpenJDK 6 b12, I 
think it would be good to resolve these remaining few differences.  The 
test directories are the same in all three code bases, except I don't 
pick up a missing newline at the end of 
./SoftCubicResampler/Interpolate.java.

During the update I ran into some testing issues, both with the original 
Gervill integration in OpenJDK 6 b10 as well as the new code for b12.  
Specifically, the 9 regression tests

javax/sound/midi/Gervill/SoftAudioSynthesizer/Open.java
javax/sound/midi/Gervill/SoftSynthesizer/GetLatency.java
javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver.java
javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver2.java
javax/sound/midi/Gervill/SoftSynthesizer/GetReceivers.java
javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitter.java
javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitters.java
javax/sound/midi/Gervill/SoftSynthesizer/ImplicitOpenClose.java
javax/sound/midi/Gervill/SoftSynthesizer/Open.java

can fail, seemingly dependent on how one logs into the machine.  What 
are the necessary and sufficient conditions for permissions to run these 
tests?  When they occur, the failures I see look like:

 Windows
=========

java.lang.IllegalArgumentException: No line matching interface 
SourceDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 
4 bytes/frame, little-endian is supported.
    at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)
    at 
javax.sound.sampled.AudioSystem.getSourceDataLine(AudioSystem.java:604)
    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:762)
    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:744)
    at Open.main(Open.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at 
com.sun.javatest.regtest.MainWrapper$MainThread.run(MainWrapper.java:96)
    at java.lang.Thread.run(Thread.java:636)

 Linux
======

STDERR:
java: conf.c:3109: snd_config_update_free: Assertion `update->count > 0 
&& update->finfo' failed.

TEST RESULT: Failed. Unexpected exit from test [exit code: 134]

 Solaris
=======

java.lang.IllegalArgumentException: No line matching interface 
SourceDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 
4 bytes/frame, little-endian is supported.
    at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:476)
    at 
javax.sound.sampled.AudioSystem.getSourceDataLine(AudioSystem.java:604)
    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:762)
    at com.sun.media.sound.SoftSynthesizer.open(SoftSynthesizer.java:744)
    at Open.main(Open.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at 
com.sun.javatest.regtest.MainWrapper$MainThread.run(MainWrapper.java:96)
    at java.lang.Thread.run(Thread.java:636)

These failures occur with the essentially Gervill CVS files I'm using as 
well as the IcedTea versions.

I've uploaded my webrev compared to the OpenJDK 6 b11 sources to

http://dcstaff.invokedynamic.info/index.php?title=Image:darcy-6717691.tgz

Below are the diffs of between Gervill CVS and my workspace and the 
recent IcedTea overlays and my workspace; I just loop over the Java 
files in the base directory, print out the file name, and then the 
result of diff-ing with the corresponding files in my workspace.

Thanks,

-Joe


 Latest Gervill CVS (July 21, 2008) vs my workspace:
========================================

AudioFileSoundbankReader.java
AudioFloatConverter.java
AudioFloatFormatConverter.java
AudioFloatInputStream.java
AudioSynthesizer.java
AudioSynthesizerPropertyInfo.java
DLSInfo.java
DLSInstrument.java
DLSModulator.java
DLSRegion.java
DLSSample.java
DLSSampleLoop.java
DLSSampleOptions.java
DLSSoundbank.java
DLSSoundbankReader.java
EmergencySoundbank.java
FFT.java
InvalidDataException.java
InvalidFormatException.java
JARSoundbankReader.java
ModelAbstractChannelMixer.java
ModelAbstractOscillator.java
ModelByteBuffer.java
ModelByteBufferWavetable.java
ModelChannelMixer.java
ModelConnectionBlock.java
ModelDestination.java
ModelDirectedPlayer.java
ModelDirector.java
ModelIdentifier.java
ModelInstrument.java
ModelInstrumentComparator.java
ModelMappedInstrument.java
ModelOscillator.java
ModelOscillatorStream.java
ModelPatch.java
ModelPerformer.java
ModelSource.java
ModelStandardDirector.java
ModelStandardTransform.java
ModelTransform.java
ModelWavetable.java
RIFFInvalidDataException.java
RIFFInvalidFormatException.java
RIFFReader.java
RIFFWriter.java
SF2GlobalRegion.java
SF2Instrument.java
SF2InstrumentRegion.java
SF2Layer.java
SF2LayerRegion.java
SF2Modulator.java
SF2Region.java
SF2Sample.java
SF2Soundbank.java
SF2SoundbankReader.java
SimpleInstrument.java
SimpleSoundbank.java
SoftAbstractResampler.java
SoftAudioBuffer.java
SoftAudioProcessor.java
SoftAudioPusher.java
SoftChannel.java
SoftChannelProxy.java
SoftChorus.java
SoftControl.java
SoftCubicResampler.java
8c8
<  * particular file as suabject to the "Classpath" exception as provided
---
 >  * particular file as subject to the "Classpath" exception as provided
SoftEnvelopeGenerator.java
SoftFilter.java
SoftInstrument.java
SoftJitterCorrector.java
SoftLanczosResampler.java
SoftLimiter.java
SoftLinearResampler.java
SoftLinearResampler2.java
SoftLowFrequencyOscillator.java
SoftMainMixer.java
SoftMidiAudioFileReader.java
SoftMixingClip.java
SoftMixingDataLine.java
SoftMixingMainMixer.java
SoftMixingMixer.java
SoftMixingMixerProvider.java
SoftMixingSourceDataLine.java
SoftPerformer.java
SoftPointResampler.java
SoftProcess.java
SoftProvider.java
SoftReceiver.java
SoftResampler.java
SoftResamplerStreamer.java
SoftReverb.java
SoftShortMessage.java
SoftSincResampler.java
SoftSynthesizer.java
SoftTuning.java
SoftVoice.java


 IcedTea 6 58510fd936ff overlays vs my workspace
======================================

AudioFileSoundbankReader.java
AudioFloatConverter.java
AudioFloatFormatConverter.java
AudioFloatInputStream.java
AudioSynthesizer.java
AudioSynthesizerPropertyInfo.java
DLSInfo.java
DLSInstrument.java
DLSModulator.java
DLSRegion.java
DLSSample.java
DLSSampleLoop.java
DLSSampleOptions.java
DLSSoundbank.java
DLSSoundbankReader.java
50,51d49
<         } catch(IOException ioe) {
<             return null;
EmergencySoundbank.java
FFT.java
InvalidDataException.java
InvalidFormatException.java
JARSoundbankReader.java
ModelAbstractChannelMixer.java
ModelAbstractOscillator.java
ModelByteBuffer.java
ModelByteBufferWavetable.java
ModelChannelMixer.java
ModelConnectionBlock.java
ModelDestination.java
ModelDirectedPlayer.java
ModelDirector.java
ModelIdentifier.java
ModelInstrument.java
ModelInstrumentComparator.java
ModelMappedInstrument.java
ModelOscillator.java
ModelOscillatorStream.java
ModelPatch.java
ModelPerformer.java
ModelSource.java
ModelStandardDirector.java
ModelStandardTransform.java
ModelTransform.java
ModelWavetable.java
RIFFInvalidDataException.java
RIFFInvalidFormatException.java
RIFFReader.java
RIFFWriter.java
SF2GlobalRegion.java
SF2Instrument.java
SF2InstrumentRegion.java
SF2Layer.java
SF2LayerRegion.java
SF2Modulator.java
SF2Region.java
SF2Sample.java
SF2Soundbank.java
SF2SoundbankReader.java
49,50d48
<         } catch(IOException ioe) {
<             return null;
SimpleInstrument.java
SimpleSoundbank.java
SoftAbstractResampler.java
SoftAudioBuffer.java
SoftAudioProcessor.java
SoftAudioPusher.java
SoftChannel.java
1197,1199c1197
<             // Should only return lower 7 bits,
<             // even when controller is "boosted" higher.
<             return this.controller[controller] & 127;
---
 >             return this.controller[controller];
SoftChannelProxy.java
SoftChorus.java
SoftControl.java
SoftCubicResampler.java
8c8
<  * particular file as suabject to the "Classpath" exception as provided
---
 >  * particular file as subject to the "Classpath" exception as provided
SoftEnvelopeGenerator.java
SoftFilter.java
SoftInstrument.java
SoftJitterCorrector.java
SoftLanczosResampler.java
SoftLimiter.java
SoftLinearResampler.java
SoftLinearResampler2.java
SoftLowFrequencyOscillator.java
SoftMainMixer.java
SoftMidiAudioFileReader.java
SoftMixingClip.java
SoftMixingDataLine.java
SoftMixingMainMixer.java
SoftMixingMixer.java
357,359d356
<                     DataLine.Info info = new DataLine.Info(
<                             SourceDataLine.class, format);
<
368,369c365,413
<                             line = (SourceDataLine) 
defaultmixer.getLine(info);
<                         else
---
 >                         {
 >                             // 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)
SoftMixingMixerProvider.java
SoftMixingSourceDataLine.java
SoftPerformer.java
SoftPointResampler.java
SoftProcess.java
SoftProvider.java
SoftReceiver.java
SoftResampler.java
SoftResamplerStreamer.java
SoftReverb.java
SoftShortMessage.java
SoftSincResampler.java
SoftSynthesizer.java
540a541,546
 >             File userhome = null;
 >             File emg_soundbank_file = null;
 >            
 >             /*
 >              *  Try to load saved generated soundbank
 >              */               
541a548,563
 >                 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
 >                  */
542a565,574
 >                
 >                 /*
 >                  *  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);
 >                 }
594,596d625
<         if (soundbank == null || !isSoundbankSupported(soundbank))
<             throw new IllegalArgumentException("Unsupported soundbank: 
" + soundbank);
<
621,623d649
<         if (soundbank == null || !isSoundbankSupported(soundbank))
<             throw new IllegalArgumentException("Unsupported soundbank: 
" + soundbank);
<
SoftTuning.java
SoftVoice.java
WaveExtensibleFileReader.java
diff: 
/net/hest.sfbay/w/darcy/ws/6-open.new/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java: 
No such file or directory
WaveFloatFileReader.java
74a75
 >         long framerate = 1;
89c90
<                 /* framerate = */chunk.readUnsignedInt();
---
 >                 framerate = chunk.readUnsignedInt();
106c107
<                 framesize, samplerate, false);
---
 >                 framesize, framerate, false);
WaveFloatFileWriter.java
diff: 
/net/hest.sfbay/w/darcy/ws/6-open.new/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileWriter.java: 
No such file or directory




More information about the audio-engine-dev mailing list