Pemutaran Audio Java, karena harus bergantung pada lingkungan setempat, Java memiliki sedikit keuntungan dalam pemrosesan audio, atau dengan kata lain, itu tidak mempertimbangkan faktor pemutaran audio ketika mengembangkan sistem Java. Anda harus tahu bahwa dalam versi Java 1.1 yang paling awal, tidak ada paket javax.sound, dan audio hanya dapat diambil melalui paket applet ...
Sayangnya, dalam pengembangan program grafis, program kami pasti perlu menggunakan musik latar, suara efek, dll. Untuk bekerja sama dengan operasi gambar. Sayangnya, ini benar -benar lelucon yang dimainkan oleh Master Sun kepada kami. Untungnya, Master Sun membuka matanya dan memberikan paket javax.
Tetapi masalah selanjutnya adalah bahwa dalam penggunaan paket javax.sound, seperti masalah umum di kelas alat java multimedia, tidak ada mekanisme pelepasan yang sangat lengkap. Jika kita melakukan pengembangan windows, menyebut Mediaplayer berulang kali mungkin bukan masalah besar, tetapi di Java, jika program audio berulang kali, sangat mudah untuk mengalami kehilangan kumulatif memori, sehingga java.lang.outofmemoryError dilemparkan, dan kemudian ... program tersebut menggantung, pengguna itu bodoh, dan kita menjadi gila ...
Ini sudah menjadi pertanyaan "apakah itu bisa ditoleransi"? Mengingat hal ini, dalam pengembangan kerangka kerja loonframework saya, saya telah mengintegrasikan metode yang relevan secara sekunder di bawah suara, berusaha untuk membuat kelas kontrol audio paling lengkap dengan kode paling sederhana. Sekarang setelah loonframework-game belum mencapai kesuksesan besar, pertama-tama kita akan mengutip beberapa metode bagi semua orang untuk melihatnya!
Sesuai dengan panggilan sumber daya jaringan, kelas URI kami sendiri ditetapkan di LoonFramework. Konten dasarnya adalah sebagai berikut:
;
Paket org.loon.framework.game.net; impor org.loon.framework.game.helper.streamhelper;/** * // ** * <p> * Judul: loonframework * </p> * <p> * Deskripsi: copyright uri (copyright uri (unified sumber daya pengidentifikasi sumber daya bersatu) * <//pe/p> * <p> * Perusahaan: LoonFramework * </p> * * @author chenpeng * @email: [email protected] * @Version 0.1 */kelas publik URI ... {// Tipe protokol transportasi statis public static int _l_uri_http = 1; public static final int _l_uri_udp = 2; string pribadi _uri; Private int _type; /** * // ** * Destructor, Digunakan untuk menyuntikkan URI dan mengetik * * @param uri * @param type */public uri (string URI, tipe int) ... {_uri = string baru (uri); _type = type; }/** * // ** * Destructor, digunakan untuk menyuntikkan uri * * @param type uri */public uri (string uri) ... {_uri = string baru (uri); _type = uri._l_uri_http; }/*** // *** Mengembalikan array byte dari sumber daya tempat URI berada. * * @return */ byte publik [] getData () ... {if (_uri == null) ... {return null; } return streamhelper.getHttpStream (_uri); } public string geturi () ... {return _uri; } public int getType () ... {return _type; }} Dalam kerangka kerja LoonFramework, kelas SoundData dasar disesuaikan untuk mengelola sumber data audio secara seragam. Paket org.loon.framework.game.sound; impor org.loon.framework.game.helper.streamhelper; import org.loon.framework.game.net.uri;/** ** ** * <p> * judul: loonframework * </p> <p> * Deskripsi: Digunakan: Digunakan ke dan Digunakan ke dan Data CACHEMUMED: LOONFRAMEWORK * </P> <P> * Deskripsi: Digunakan: Uraian: Digunakan: kerangka kerja) * </p> * <p> * Hak Cipta: Hak Cipta (C) 2007 * </p> * <p> * Perusahaan: LoonFramework * </p> * * @author chenpeng * @email: [email protected] * @version 0.1 */class public sounddata ... {private byte.com. private boolean _loop; Private int _type; public static final int _l_soundtype_midi = 1; public static final int _l_soundtype_wav = 2; /** * // ** * Destructor, Digunakan untuk menyuntikkan URI, ketik, loop * * @param uri * @param type * @param loop */public sounddata (uri uri, tipe int, loop boolean) ... {if (uri! = Null) ... {_data = uole.getdata (); } _type = type; _loop = loop; }/** * // ** * DESTRUCTOR, Digunakan untuk menyuntikkan data, ketik, loop * * @param data * @param type * @param loop */public soundData (byte [] data, tipe int, boolean loop) ... {if (data! = Null & data.length> 0) ... {{if if (data = null & lengthen; // langsung menyalin byte array system.arraycopy (data, 0, _data, 0, _data.length); } _type = type; _loop = loop; }/** * // ** * Destructor, digunakan untuk menyuntikkan resname, ketik, loop * @param resname * @param type * @param loop */sounddata publik (string resname, tipe int, loop boolean) ... {this (streamhelper.getDataSource (resname), type, loop); } byte publik [] getData () ... {return _data; } public boolean getloop () ... {return _loop; } public void setloop (loop boolean) ... {_loop = loop; } public int getType () ... {return _type; }}
LoonFramework merangkum metode terkait pemutaran audio dan permainan suara. Programmer dapat mengabaikan detail internal javax.sound dan secara langsung memanggil permainan suara untuk menyelesaikan operasi terkait.
Paket org.loon.framework.game.sound; import java.io.bytearrayinputStream; import javax.sound.midi.metaeventlistener; impor javax.sound.midi.metamessage; impor javax.sound.midi.midisystem; impor; javax.sound.midi.Sequencer; impor javax.sound.sampled.audiofileformat; impor javax.sound.sampled.audiosystem; impor javax.sound.sampled.clip; Impor Javax.sound.sampled.datain; * <p> * Title: LoonFramework * </p> * <p> * Description: Used to perform sound file operations (only some methods in Loonframework, see the Loonframework-game framework for more details) * </p> * <p> * Copyright: Copyright (c) 2007 * </p> * <p> * Company: LoonFramework * </p> * * @author chenpeng * @email: [email protected] * @Version 0.1 */kelas publik Implements MetaeventListener, runnable ... {private int _sleepTime; klip pribadi _Audio; Sequencer private _midi; private boolean _loop; private int _soundType; boolean private _playing; utas pribadi _thread = null; private boolean _isrun = false; /** * // ** * Destructor, inisialisasi permainan suara * */public soundplay () ... {_loop = false; _soundType = 0; _SleepTime = 1000; _playing = false; } // Muat file suara boolean public load (data soundData) ... {reset (); if (data == null || data.getData () == null) ... {return false; } return init (data.getData (), data.getType (), data.getloop ()); }/** * // ** * Pemutaran langsung dari file URL * * @param uri * @param ftype * @param loop * @return */public boolean load (URI uri, int ftype, boolean loop) ... {// refresh data reset (); if (uri == null) ... {return false; } // Dapatkan SoundData SoundData Data = SoundData baru (URI, FTYPE, LOOP); if (data == null || data.getData () == null) ... {return false; } return init (data.getData (), data.getType (), data.getloop ()); }/** * // ** * Inisialisasi data yang berhubungan dengan suara * * @param data * @param ftype * @param loop * @return */private boolean init (byte [] data, int ftype, boolean loop) ... {boolean hasil = false; BytearrayInputStream bis = null; coba ... {bis = new ByteArrayInputStream (data); } catch (Exception e) ... {bis = null; } if (bis == null) ... {return false; } // menilai tipe switch (ftype) ... {// midi case sounddata._l_soundtype_midi: // ketika midi tidak ada jika (_midi == null) ... {coba ... {// dapatkan sequencer _midi = midisystem.getequencer (); _midi.open (); } catch (Exception ex) ... {_midi = null; } if (_midi! = null) ... {_midi.addMetaEventListener (ini); }} // Saat MIDI masih belum diperoleh jika (_midi! = NULL) ... {// Ciptakan Urutan Urutan SC = NULL; coba ... {sc = midisystem.getequence (bis); } catch (Exception e) ... {sc = null; } if (sc! = null) ... {coba ... {_midi.setSequence (sc); // Dapatkan apakah akan loop_loop = loop; // Dapatkan apakah akan memuat hasil = true; } catch (Exception ee) ... {} // dapatkan sound type_soundtype = soundData._l_soundtype_midi; }} coba ... {bis.close (); } catch (Exception ee) ... {} break; // wav case sounddata._l_soundtype_wav: audiofileformat type = null; // Dapatkan audio coba ... {type = audiosystem.getaAudiofileformat (BIS); } catch (Exception e) ... {type = null; } // tutup aliran coba ... {bis.close (); } catch (Exception ex) ... {} if (type == null) ... {return false; } // Bangun objek informasi dari baris data berdasarkan informasi yang ditentukan dataline.info di = dataline.info baru (clip.class, type.getFormat ()); // Konversi ke klip coba ... {_Audio = (clip) audiosystem.getline (DI); } catch (Exception e) ... {} // Mainkan file coba ... {_Audio.open (type.getFormat (), data, 0, data.length); _loop = loop; Hasil = Benar; } catch (Exception e) ... {} // Dapatkan jenis file _soundType = soundData._l_soundType_wav; merusak; } hasil pengembalian; } play boolean publik (data soundData) ... {if (! Load (data)) ... {return false; } return play (); } public boolean play () ... {switch (_soundType) ... {case sounddata._l_soundtype_midi: coba ... {_midi.start (); _playing = true; _soundType = sounddata._l_soundtype_midi; } catch (Exception ee) ... {} break; case sounddata._l_soundtype_wav: if (_audio! = null) ... {if (_loop) ... {// atur loop _Audio.setloopPoints (0, -1); _Audio.setFrameposition (0); _Audio.loop (clip.loop_continuously); } else ... {// paksa posisi pemutaran ke 0 _Audio.setFrameposition (0); _Audio.start (); } _playing = true; } merusak; } return _playing; }/*** // *** Pemutaran otomatis, loop berakhir setelah berhenti. * * @param data * @return */ autoplay boolean publik (data sounddata) ... {if (! load (data)) ... {return false; } return autoplay (); }/*** // *** Pemutaran otomatis, loop berakhir setelah berhenti. * * @return */ public boolean autoplay () ... {_isrun = true; _thread = utas baru (ini); _thread.start (); mengembalikan _playing; }/***// ***berhenti bermain*/public void stop () ... {if (_Audio! = Null && _Audio.isActive ()) ... {coba ... {_audio.stop (); } catch (Exception e) ... {}} if (_midi! = null) ... {_midi.stop (); } _playing = false; _isrun = false; }/*** // *** Rilis data**/public void reset () ... {stop (); _loop = false; _soundType = 0; if (_midi! = null) ... {_midi.close (); _midi = null; } if (_Audio! = null && _Audio.isopen ()) ... {_Audio.close (); _Audio = null; } _isrun = false; _thread = null; }/***// ***Atur metamessage*/public void meta (metamessage meta) ... {// Tentukan apakah akan bermain midi loop if (_loop && _soundType == soundData._l_soundtype_midi && meta.getpype () == 47) ... _midi.isopen ()) ... {_midi.setmicrosecondposition (0); _midi.start (); }}} public void run () ... {while (_isrun) ... {play (); // Karena jenis pemutarannya unik, hanya satu hasil _playing yang akan dikembalikan untuk menentukan ini. if (_midi! = null) ... {_playing = _midi.isrunning (); } if (_Audio! = null) ... {_playing = _Audio.isrunning (); } // Saat pemutaran berhenti jika (! _Playing) ... {// rilis reset (); } coba ... {thread.sleep (_sleeptime); } catch (InterruptedException e) ... {E.PrintStackTrace (); }}} public int getsleeptime () ... {return _sleeptime; }/*** // *** Atur waktu loop utas autoplay. * * @param Time */ public void setSleepTime (int time) ... {_sleepTime = waktu; }}
Pada saat ini, apa yang perlu kita hadapi hanyalah data SoundData dan operasi permainan suara yang dienkapsulasi sebagai entitas, tanpa harus berurusan dengan javax yang rumit lagi.
Metode panggilan adalah sebagai berikut:
Paket org.test; impor org.loon.framework.game.helper.streamhelper; impor org.loon.framework.game.net.uri; impor org.loon.framework.game.sound.soundData; Import** Powramewework.game.sound.soundplay; * <p> Deskripsi: Tes pemutaran permainan suara </p> * <p> Hak cipta: Hak cipta (c) 2007 </p> * <p> Perusahaan: LoonFramework </p> * @Author Chenpeng * @email: [email protected] * @version 0.1 */kelas publik Soundllay ... {static vaid) .. @Version 0.1 */class publik Soundllay ... {static vaid) .. @version 0.1 */class public class publicllay ... {static vaid) .. fange) .. fange cl soundplay .. @Version 0.1/public class ... Switch (ftype) .. {// Mainkan musik dari jaringan melalui URI di bawah loonFramework case 0: data = new sounddata (URI baru ("http://looframework.sourceForge.net/midi/Who adalah pahlawan besar. merusak; // mainkan musik melalui objek byte [] dari file musik di bawah sumber daya lokal 1: byte [] bytes = streamHelper.getResourcedata ("/midi/who is the besar hero.mid"); data = sounddata baru (bytes, sounddata._l_soundtype_midi, false); merusak; // mainkan musik melalui jalur musik jalur case 2: data = new SoundData ("c:/siapa adalah pahlawan besar. merusak; } Sound play play = new soundplay (); // Perbedaan antara autoplay dan metode bermain adalah bahwa autoplay akan secara otomatis berhenti dan melepaskan sumber daya setelah bermain, dan permainan harus dibatalkan secara manual. //play.play(data); play.autoplay (data); } public static void main (string [] args) .. {selectplay (2); }}
Metode yang lebih rinci akan dijelaskan setelah loonframework-game diumumkan sepenuhnya.
Selain itu: karena streamhelper dikaitkan dengan metode loonframework lainnya, itu belum akan diberikan. InputStream to byte [] dapat ditulis sebagai berikut:
// IS adalah inputStream yang diperoleh bytearrayoutputStream bytearrayoutputStream = bytearrayoutputStream baru (); // digunakan untuk melakukan byte [] byte [] arraybyte = null; Coba ... {// Ukuran setiap transfer adalah 4096 byte [] bytes = byte baru [4096]; bytes = byte baru [is.available ()]; int baca; while ((baca = is.read (bytes))> = 0) ... {bytearrayoutputStream.write (bytes, 0, baca); } arraybyte = bytearrayoutputStream.tobyteArray (); } catch (ioException e) ... {return null; } akhirnya ... {coba ... {if (bytearrayoutputStream! = null) ... {bytearrayoutputStream.close (); bytearrayoutputStream = null; } if (is! = null) ... {is.close (); IS = NULL; }} catch (ioException e) ... {}}