view overlays/openjdk/jdk/src/share/classes/com/sun/media/sound/JARSoundbankReader.java @ 843:bcba163568ac

Integrate Gervill. 2008-04-30 Mark Wielaard <mark@klomp.org> * Makefile.am (ICEDTEA_PATCHES): Add patches/icedtea-gervill.patch. * Makefile.in: Regenerated. * patches/icedtea-gervill.patch: New patch. * overlays/openjdk/jdk/src/share/classes/com/sun/media/sound/*: New Gervill files.
author Mark Wielaard <mark@klomp.org>
date Wed, 30 Apr 2008 22:09:08 +0200
parents
children
line wrap: on
line source

/*
  * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Sun designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Sun in the LICENSE file that accompanied this code.
  *
  * This code is distributed in the hope that it will be useful, but WITHOUT
  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  * version 2 for more details (a copy is included in the LICENSE file that
  * accompanied this code).
  *
  * You should have received a copy of the GNU General Public License version
  * 2 along with this work; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  *
  * Please contact Sun 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 ued to read sounbank object from jar files.
 *
 * @version %I%, %E%
 * @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<Soundbank> soundbanks = new ArrayList<Soundbank>();		
		URLClassLoader ucl = URLClassLoader.newInstance(new URL[] {url});
		InputStream stream = ucl.getResourceAsStream("META-INF/services/javax.sound.midi.Soundbank");
		if(stream == null) return null;
		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 (Exception e) {
					e.printStackTrace();
				}
			}
			line = r.readLine();
		}
		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());
	}

}