From 2772b152206f547825efaf7fe45f6226a10d7179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 9 Mar 2014 11:13:18 +0100 Subject: [PATCH] Internal Viewer: Playing exportable sounds using Java - wav, mp3 using JLayer --- trunk/lib/jl1.0.1.jar | Bin 0 -> 109710 bytes trunk/nbproject/project.xml | 2 +- trunk/src/com/jpexs/decompiler/flash/SWF.java | 86 ++++--- .../decompiler/flash/gui/ImagePanel.java | 4 +- .../jpexs/decompiler/flash/gui/MainPanel.java | 222 ++++++++++++++++-- .../decompiler/flash/gui/TagTreeModel.java | 3 +- .../flash/gui/player/FlashPlayerPanel.java | 2 +- .../{FlashDisplay.java => MediaDisplay.java} | 2 +- .../flash/gui/player/PlayerControls.java | 15 +- .../decompiler/flash/tags/DefineSoundTag.java | 6 + .../flash/tags/SoundStreamHead2Tag.java | 10 + .../flash/tags/SoundStreamHeadTag.java | 34 +++ .../tags/base/SoundStreamHeadTypeTag.java | 5 + .../flash/types/sound/MP3FRAME.java | 36 ++- .../flash/types/sound/MP3SOUNDDATA.java | 43 ++++ .../com/jpexs/helpers/sound/MP3Player.java | 191 +++++++++++++++ .../com/jpexs/helpers/sound/SoundPlayer.java | 47 ++++ .../com/jpexs/helpers/sound/WavPlayer.java | 123 ++++++++++ 18 files changed, 768 insertions(+), 63 deletions(-) create mode 100644 trunk/lib/jl1.0.1.jar rename trunk/src/com/jpexs/decompiler/flash/gui/player/{FlashDisplay.java => MediaDisplay.java} (93%) create mode 100644 trunk/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java create mode 100644 trunk/src/com/jpexs/helpers/sound/MP3Player.java create mode 100644 trunk/src/com/jpexs/helpers/sound/SoundPlayer.java create mode 100644 trunk/src/com/jpexs/helpers/sound/WavPlayer.java diff --git a/trunk/lib/jl1.0.1.jar b/trunk/lib/jl1.0.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..caaf140d46ad62007a9e33d40d3de9a0920a1f3e GIT binary patch literal 109710 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 +|@Zh1sBbEeSqC}qqMTyXN1A*&EQ4b94?DH|17 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

ntk$h9%>$OsM<2jSD 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%0DDK{Sy3J zLr4n<(*h5z-i#%=-nUalb&;#Ko;J^d79?v*P;a}!l`je~nM;oRlL=ZpN~a24srBMzTSYtAlDd0vfeV5eXpbpn#er5R-8(P zWrJxg<;>oD#Y2mS7qvYMt`4pbv!FL=?leIRsE4eTk#d_14;oDw}%YJu<&9c(kHsuTwW)rvb^DWY?=g)IZZM=AIxi_ z#6dBhNJ`L(p)b}eH@N8`?3{%5gyCyu5JS@rYG#O{*dOD3(c$5Jr}p;lAC%gWZ^MB5}qluQ0-m2`6k#BT>SZ!eTC7dhOsMwU3ZhqQ<+_HbiJ4RMCc;RPjAS(`4#ol z7<*BWK4(u7uTtVu%BOtn`GKd?j$h7;Umlwwr$<+AvR<`rZsnJA?Y?)}vw0bTb*VVu zK+SBk+@|>A+v=bGkzT6VB~8F!$N_&l7(NC;dvrhQ1mM{AM}d9>T#C3?WJOg3X(i>v z=&yVJ_frfU4N+m>zl#75+P%+sfnWdqR8~+f+`X0hZ z;Mad+ZT#*tU~PS;Y~KCM$_9wA@i)Pr!+Bub`R>spRABY_UxL7w#`bn@rcOYB=RYw1 zBeB~IQ3pH8UpxRo`2ZXX-op_8C5G^S&`1=VEbUy>oh$)l1t)uRCsSwV`?mn@Hqb3O zp+w5oTVQgamDui)qX(MwVV3Wb`!_T`Q;A0m0cqaOiT*A#zz+OB(D-w+{b#m~ z*uC&e04ZTZ0j&Rx2fXb9TKF)em5nh8@CZ7Y|CL_oXVA3N57+#_xc~=H^VkVGCC~YY9_BlmBc${LHR+ ze_CA`AV7NHJ~+wW@W9(L=08z*nCHC{d4J zpIK=hCNOuR5@iEuS_9B@tbd~eZ`_3cj)1+Bt)YwlAF_Fv1i|t6N+ZDkI6#K;9tjvg zNdKk|cSwjBx)?r8MslDLrwXV=3D8aN3!jqgpU6CnI4n4dsR=N>4rt)5Gx^_z2Kf1V z#_y#`yVaBbn8BZ|(tSfZ54gJB1vW7?wg=Sho=v(<{L*l4z4a7e4HtNBlPLaOkmw#p zFmz=CvMSzYg85l%^S|NO-&S)KsOEjac>`gI9^yvG(nZM>Kyv%*&dAS*-L!Ou`#>|i z20AJ6->d;|7@AM1vvRxc~ zkPSc{1GT5Q2iwW_Pq5F7O&we;?d=|BI91Y;q6$Df03O17$gKhoBLgPf#mV00VYoGZ ztzbTY(OTfSZwFfie*x!Y%*ggISR^N9ryWq^E1_6ZumMNfZp73~hfQ zOQ#NPX+*$GuLIWpevJ{uevA4rlk5_SXk!3pXh4nc4=1)VzlHl;&iL1wL}sov z!434xY+$&)-0)T~FoW1f+)))k z>kI-df8UfV#y$)wX$K@fRQ|&z-OZ))v#Bdc@;7-7)Hoh^?sq0l;7<=(CMm#cS?2Z- z;}1=JnBD0cn=feqVgvBpw|Ddj{|5CJeKc2o4ciWoLM9-E`}U47@t}EWSYQyYgYVUMA>w94Iga(x)fB^buKF~jJZ;=08EGr&{`=jwC z|6@~?U5$(k?Mxn)0O#9NaXdf*MZl!;{_L!;`u_p`2gSc44BZvS?Q%mszUw#&&<7`g zf04hL2i~Ls?R!XpALRc}5|Va6>={_!=-uxz}^54;~n5fkG`D#OK3A-fVKI>q@O_FWEls59s?ehd+?fP z{|?^8)Yie?$aNin^pZ|X;{G#XGOlcO}l!VY6B+)70p6hG9%SXeNP-VULH-&2ZaBRA3b>;Bd-S_; z7=K2+8@}xR@M5X)FHrwCu-?xE?uID3ui=Q=|4iV2tRoTfpTX`P;*s9#0QRqb19sPoML`-ISYthUqzwGK1jab;Xkg~_=>GsJPF~~y literal 0 HcmV?d00001 diff --git a/trunk/nbproject/project.xml b/trunk/nbproject/project.xml index 9ef98a8b3..21528e0a9 100644 --- a/trunk/nbproject/project.xml +++ b/trunk/nbproject/project.xml @@ -156,7 +156,7 @@ src - lib/LZMA.jar;lib/jna-3.5.1.jar;lib/jpproxy.jar;lib/jsyntaxpane-0.9.5.jar;lib/trident-6.2.jar;lib/substance-flamingo-6.2.jar;lib/flamingo-6.2.jar;lib/substance-6.2.jar + lib/LZMA.jar;lib/jna-3.5.1.jar;lib/jpproxy.jar;lib/jsyntaxpane-0.9.5.jar;lib/trident-6.2.jar;lib/substance-flamingo-6.2.jar;lib/flamingo-6.2.jar;lib/substance-6.2.jar;lib/jl1.0.1.jar build javadoc reports diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index 4cbf6104e..598b32b60 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -1181,28 +1181,6 @@ public final class SWF implements TreeItem, Timelined { return false; } - public static void populateSoundStreamBlocks(List tags, Tag head, List output) { - boolean found = false; - for (ContainerItem t : tags) { - if (t == head) { - found = true; - continue; - } - if (!found) { - continue; - } - if (t instanceof SoundStreamBlockTag) { - output.add((SoundStreamBlockTag) t); - } - if (t instanceof SoundStreamHeadTypeTag) { - break; - } - if (t instanceof Container) { - populateSoundStreamBlocks(((Container) t).getSubItems(), head, output); - } - } - } - public void populateVideoFrames(int streamId, List tags, HashMap output) { for (ContainerItem t : tags) { if (t instanceof VideoFrameTag) { @@ -1229,7 +1207,10 @@ public final class SWF implements TreeItem, Timelined { if (t instanceof DefineSoundTag) { DefineSoundTag st = (DefineSoundTag) t; - if ((st.soundFormat == DefineSoundTag.FORMAT_ADPCM) && wave) { + if ((st.soundFormat == DefineSoundTag.FORMAT_UNCOMPRESSED_LITTLE_ENDIAN || st.soundFormat == DefineSoundTag.FORMAT_UNCOMPRESSED_NATIVE_ENDIAN) && wave) { + //Does endiannes matter here? + createWavFromPcmData(fos, st.soundRate, st.soundSize, st.soundType, st.soundData); + } else if ((st.soundFormat == DefineSoundTag.FORMAT_ADPCM) && wave) { createWavFromAdpcm(fos, st.soundRate, st.soundSize, st.soundType, st.soundData); } else if ((st.soundFormat == DefineSoundTag.FORMAT_MP3) && mp3) { fos.write(st.soundData, 2, st.soundData.length - 2); @@ -1241,8 +1222,7 @@ public final class SWF implements TreeItem, Timelined { } if (t instanceof SoundStreamHeadTypeTag) { SoundStreamHeadTypeTag shead = (SoundStreamHeadTypeTag) t; - List blocks = new ArrayList<>(); - populateSoundStreamBlocks(this.tags, t, blocks); + List blocks = shead.getBlocks(); if ((shead.getSoundFormat() == DefineSoundTag.FORMAT_ADPCM) && wave) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); for (int b = 0; b < blocks.size(); b++) { @@ -1250,6 +1230,14 @@ public final class SWF implements TreeItem, Timelined { baos.write(data); } createWavFromAdpcm(fos, shead.getSoundRate(), shead.getSoundSize(), shead.getSoundType(), baos.toByteArray()); + } + if ((shead.getSoundFormat() == DefineSoundTag.FORMAT_UNCOMPRESSED_LITTLE_ENDIAN || shead.getSoundFormat() == DefineSoundTag.FORMAT_UNCOMPRESSED_NATIVE_ENDIAN) && wave) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int b = 0; b < blocks.size(); b++) { + byte[] data = blocks.get(b).getData(); + baos.write(data); + } + createWavFromPcmData(fos, shead.getSoundRate(), shead.getSoundSize(), shead.getSoundType(), baos.toByteArray()); } else if ((shead.getSoundFormat() == DefineSoundTag.FORMAT_MP3) && mp3) { for (int b = 0; b < blocks.size(); b++) { byte[] data = blocks.get(b).getData(); @@ -1280,9 +1268,7 @@ public final class SWF implements TreeItem, Timelined { } } - private static void createWavFromAdpcm(OutputStream fos, int soundRate, boolean soundSize, boolean soundType, byte[] data) throws IOException { - byte[] pcmData = AdpcmDecoder.decode(data, soundType); - + private static void createWavFromPcmData(OutputStream fos, int soundRate, boolean soundSize, boolean soundType, byte[] data) throws IOException { ByteArrayOutputStream subChunk1Data = new ByteArrayOutputStream(); int audioFormat = 1; //PCM writeLE(subChunk1Data, audioFormat, 2); @@ -1305,15 +1291,18 @@ public final class SWF implements TreeItem, Timelined { chunks.write(subChunk1DataBytes); chunks.write(Utf8Helper.getBytes("data")); - writeLE(chunks, pcmData.length, 4); - chunks.write(pcmData); + writeLE(chunks, data.length, 4); + chunks.write(data); fos.write(Utf8Helper.getBytes("RIFF")); byte[] chunkBytes = chunks.toByteArray(); writeLE(fos, 4 + chunkBytes.length, 4); fos.write(Utf8Helper.getBytes("WAVE")); fos.write(chunkBytes); - //size1=>16bit*/ + } + + private static void createWavFromAdpcm(OutputStream fos, int soundRate, boolean soundSize, boolean soundType, byte[] data) throws IOException { + createWavFromPcmData(fos, soundRate, soundSize, soundType, AdpcmDecoder.decode(data, soundType)); } public List exportSounds(AbortRetryIgnoreHandler handler, String outdir, List tags, boolean mp3, boolean wave) throws IOException { @@ -1339,7 +1328,19 @@ public final class SWF implements TreeItem, Timelined { if (t instanceof DefineSoundTag) { final DefineSoundTag st = (DefineSoundTag) t; - if ((st.soundFormat == DefineSoundTag.FORMAT_ADPCM) && wave) { + if (st.soundFormat == DefineSoundTag.FORMAT_UNCOMPRESSED_LITTLE_ENDIAN || st.soundFormat == DefineSoundTag.FORMAT_UNCOMPRESSED_NATIVE_ENDIAN) { + //Does endiannes matter here? + final File file = new File(outdir + File.separator + st.getCharacterExportFileName() + ".wav"); + newfile = file; + new RetryTask(new RunnableIOEx() { + @Override + public void run() throws IOException { + try (OutputStream os = new BufferedOutputStream(new FileOutputStream(file))) { + createWavFromPcmData(os, st.soundRate, st.soundSize, st.soundType, st.soundData); + } + } + }, handler).run(); + } else if ((st.soundFormat == DefineSoundTag.FORMAT_ADPCM) && wave) { final File file = new File(outdir + File.separator + st.getCharacterExportFileName() + ".wav"); newfile = file; new RetryTask(new RunnableIOEx() { @@ -1378,11 +1379,26 @@ public final class SWF implements TreeItem, Timelined { } if (t instanceof SoundStreamHeadTypeTag) { final SoundStreamHeadTypeTag shead = (SoundStreamHeadTypeTag) t; - final List blocks = new ArrayList<>(); + final List blocks = ((SoundStreamHeadTypeTag) t).getBlocks(); List objs = new ArrayList<>(); objs.addAll(this.tags); - populateSoundStreamBlocks(objs, t, blocks); - if ((shead.getSoundFormat() == DefineSoundTag.FORMAT_ADPCM) && wave) { + if ((shead.getSoundFormat() == DefineSoundTag.FORMAT_UNCOMPRESSED_LITTLE_ENDIAN || shead.getSoundFormat() == DefineSoundTag.FORMAT_UNCOMPRESSED_NATIVE_ENDIAN) && wave) { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int b = 0; b < blocks.size(); b++) { + byte[] data = blocks.get(b).getData(); + baos.write(data); + } + final File file = new File(outdir + File.separator + id + ".wav"); + newfile = file; + new RetryTask(new RunnableIOEx() { + @Override + public void run() throws IOException { + try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(file))) { + createWavFromPcmData(fos, shead.getSoundRate(), shead.getSoundSize(), shead.getSoundType(), baos.toByteArray()); + } + } + }, handler).run(); + } else if ((shead.getSoundFormat() == DefineSoundTag.FORMAT_ADPCM) && wave) { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); for (int b = 0; b < blocks.size(); b++) { byte data[] = blocks.get(b).getData(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index 7ff3d7464..34305035c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -19,7 +19,7 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.AppStrings; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.exporters.Matrix; -import com.jpexs.decompiler.flash.gui.player.FlashDisplay; +import com.jpexs.decompiler.flash.gui.player.MediaDisplay; import com.jpexs.decompiler.flash.tags.base.BoundedTag; import com.jpexs.decompiler.flash.tags.base.ButtonTag; import com.jpexs.decompiler.flash.tags.base.CharacterTag; @@ -56,7 +56,7 @@ import javax.swing.JColorChooser; import javax.swing.JLabel; import javax.swing.JPanel; -public final class ImagePanel extends JPanel implements ActionListener, FlashDisplay { +public final class ImagePanel extends JPanel implements ActionListener, MediaDisplay { static final String ACTION_SELECT_BKCOLOR = "SELECTCOLOR"; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java index d9d1ad2fb..3d3f97a06 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -36,6 +36,7 @@ import com.jpexs.decompiler.flash.gui.abc.LineMarkedEditorPane; import com.jpexs.decompiler.flash.gui.abc.treenodes.TreeElement; import com.jpexs.decompiler.flash.gui.action.ActionPanel; import com.jpexs.decompiler.flash.gui.player.FlashPlayerPanel; +import com.jpexs.decompiler.flash.gui.player.MediaDisplay; import com.jpexs.decompiler.flash.gui.player.PlayerControls; import com.jpexs.decompiler.flash.gui.timeline.TimelineFrame; import com.jpexs.decompiler.flash.gui.treenodes.SWFBundleNode; @@ -118,6 +119,10 @@ import com.jpexs.decompiler.flash.xfl.FLAVersion; import com.jpexs.decompiler.graph.ExportMode; import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; +import com.jpexs.helpers.SerializableImage; +import com.jpexs.helpers.sound.MP3Player; +import com.jpexs.helpers.sound.SoundPlayer; +import com.jpexs.helpers.sound.WavPlayer; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; @@ -145,9 +150,11 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -196,6 +203,7 @@ import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; +import javazoom.jl.decoder.JavaLayerException; /** * @@ -272,6 +280,144 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec public TreeNode oldNode; public TreeItem oldTag; private File tempFile; + private PlayerControls imagePlayControls; + + private SoundThread soundThread = null; + + private class SoundThread implements MediaDisplay { + + private SoundPlayer player; + + private int mp3SampleCount; + private boolean mp3; + private Thread thr; + private int actualPos = 0; + private boolean playing = false; + private int mp3FrameRate; + private byte data[]; + + private static final int FRAME_DIVISOR = 1024; + + public SoundThread(byte data[]) { + this(data, false, 0, 0); + } + + public SoundThread(byte data[], boolean mp3, int mp3SampleCount, int mp3FrameRate) { + this.data = data; + this.mp3SampleCount = mp3SampleCount; + this.mp3 = mp3; + this.mp3FrameRate = mp3FrameRate; + + } + + @Override + public synchronized int getCurrentFrame() { + if (player == null) { + return 0; + } + + if (!playing) { + return actualPos; + } + + actualPos = (int) (player.getSamplePosition() / FRAME_DIVISOR); + return actualPos; + } + + @Override + public synchronized int getTotalFrames() { + //System.out.println("getTotalFrames"); + if (player == null) { + return 0; + } + int ret = (int) (player.samplesCount() / FRAME_DIVISOR); + + //System.out.println("/getTotalFrames"); + return ret; + } + + @Override + public synchronized void pause() { + if (!playing) { + return; + } + playing = false; + actualPos = (int) (player.getSamplePosition() / FRAME_DIVISOR); + player.stop(); + + } + + @Override + public synchronized void play() { + if (player != null) { + player.stop(); + } + + if (mp3) { + try { + player = new MP3Player(new ByteArrayInputStream(data), mp3SampleCount, mp3FrameRate); + } catch (JavaLayerException ex) { + Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex); + } + } else { + player = new WavPlayer(new ByteArrayInputStream(data)); + } + final int startPos = actualPos * FRAME_DIVISOR; + thr = new Thread() { + + @Override + public void run() { + player.skip(startPos); + player.play(); + if (playing) { + gotoFrame(0); + play(); + } + } + + }; + thr.start(); + playing = true; + } + + @Override + public void rewind() { + actualPos = 0; + } + + @Override + public boolean isPlaying() { + return playing; + } + + @Override + public synchronized void gotoFrame(int frame) { + if (playing) { + playing = false; + player.stop(); + } + actualPos = frame; + } + + @Override + public void setBackground(Color color) { + + } + + @Override + public int getFrameRate() { + if (player == null) { + return 1; + } + return (int) (player.getFrameRate() / FRAME_DIVISOR); + } + + @Override + public boolean isLoaded() { + return true; + } + + } private static final String ACTION_SELECT_BKCOLOR = "SELECTCOLOR"; private static final String ACTION_REPLACE_IMAGE = "REPLACEIMAGE"; @@ -739,8 +885,24 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec if (flashPanel != null) { JPanel flashPlayPanel = new JPanel(new BorderLayout()); flashPlayPanel.add(flashPanel, BorderLayout.CENTER); - flashPlayPanel.add(flashControls = new PlayerControls(flashPanel), BorderLayout.SOUTH); - leftComponent = flashPlayPanel; + + JPanel bottomPanel = new JPanel(new BorderLayout()); + JPanel buttonsPanel = new JPanel(new FlowLayout()); + JButton selectColorButton = new JButton(View.getIcon("color16")); + selectColorButton.addActionListener(this); + selectColorButton.setActionCommand(ACTION_SELECT_BKCOLOR); + selectColorButton.setToolTipText(AppStrings.translate("button.selectbkcolor.hint")); + buttonsPanel.add(selectColorButton); + bottomPanel.add(buttonsPanel, BorderLayout.EAST); + + flashPlayPanel.add(bottomPanel, BorderLayout.SOUTH); + + JPanel flashPlayPanel2 = new JPanel(new BorderLayout()); + flashPlayPanel2.add(flashPlayPanel, BorderLayout.CENTER); + flashPlayPanel2.add(flashControls = new PlayerControls(flashPanel), BorderLayout.SOUTH); + + //pan.add(bottomPanel, BorderLayout.SOUTH); + leftComponent = flashPlayPanel2; } else { JPanel swtPanel = new JPanel(new BorderLayout()); swtPanel.add(new JLabel("

" + translate("notavailonthisplatform") + "
", JLabel.CENTER), BorderLayout.CENTER); @@ -782,15 +944,7 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec ((CardLayout) viewerCards.getLayout()).show(viewerCards, FLASH_VIEWER_CARD); if (flashPanel != null) { - JPanel bottomPanel = new JPanel(new BorderLayout()); - JPanel buttonsPanel = new JPanel(new FlowLayout()); - JButton selectColorButton = new JButton(View.getIcon("color16")); - selectColorButton.addActionListener(this); - selectColorButton.setActionCommand(ACTION_SELECT_BKCOLOR); - selectColorButton.setToolTipText(AppStrings.translate("button.selectbkcolor.hint")); - buttonsPanel.add(selectColorButton); - bottomPanel.add(buttonsPanel, BorderLayout.EAST); - pan.add(bottomPanel, BorderLayout.SOUTH); + } pan.add(leftComponent, BorderLayout.CENTER); viewerCards.add(pan, FLASH_VIEWER_CARD); @@ -816,7 +970,7 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec JPanel previewCnt = new JPanel(new BorderLayout()); previewCnt.add(previewImagePanel, BorderLayout.CENTER); - previewCnt.add(new PlayerControls(previewImagePanel), BorderLayout.SOUTH); + previewCnt.add(imagePlayControls = new PlayerControls(previewImagePanel), BorderLayout.SOUTH); previewPanel.add(previewCnt, BorderLayout.CENTER); JLabel prevIntLabel = new HeaderLabel(translate("swfpreview.internal")); prevIntLabel.setHorizontalAlignment(SwingConstants.CENTER); @@ -2364,6 +2518,10 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec } swfPreviewPanel.stop(); imagePanel.stop(); + if (soundThread != null) { + soundThread.pause(); + } + imagePlayControls.setMedia(imagePanel); stopFlashPlayer(); if (tagObj instanceof ScriptPack) { final ScriptPack scriptLeaf = (ScriptPack) tagObj; @@ -2515,8 +2673,42 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec timelined = ((DefineSpriteTag) fn.getParent()); } previewImagePanel.setTimelined(timelined, swf, fn.getFrame() - 1); - //previewImagePanel.setImage(SWF.frameToImageGet(timeline, fn.getFrame() - 1, null,0,rect, Matrix.getScaleInstance(1 / SWF.unitDivisor), new ColorTransform())); - } else if (((tagObj instanceof FrameNodeItem) && ((FrameNodeItem) tagObj).isDisplayed()) || ((tagObj instanceof CharacterTag) || (tagObj instanceof FontTag)) && (tagObj instanceof Tag)) { + } else if (((tagObj instanceof DefineSoundTag) && mainMenu.isInternalFlashViewerSelected() && (Arrays.asList("mp3", "wav").contains(((DefineSoundTag) tagObj).getExportFormat()))) + || ((tagObj instanceof SoundStreamHeadTypeTag) && mainMenu.isInternalFlashViewerSelected() && (Arrays.asList("mp3", "wav").contains(((SoundStreamHeadTypeTag) tagObj).getExportFormat())))) { + showCard(CARDDRAWPREVIEWPANEL); + previewImagePanel.setImage(new SerializableImage(1, 1, BufferedImage.TYPE_INT_ARGB)); + + String exportFormat = ""; + int soundRate = 0; + long sampleCount = 0; + boolean soundType = false; + if (tagObj instanceof DefineSoundTag) { + DefineSoundTag ds = (DefineSoundTag) tagObj; + exportFormat = ds.getExportFormat(); + soundRate = ds.soundRate; + sampleCount = ds.soundSampleCount; + soundType = ds.soundType; + } + if (tagObj instanceof SoundStreamHeadTypeTag) { + SoundStreamHeadTypeTag sh = (SoundStreamHeadTypeTag) tagObj; + exportFormat = sh.getExportFormat(); + soundRate = sh.getSoundRate(); + sampleCount = sh.getSoundSampleCount() * sh.getBlocks().size(); + soundType = sh.getSoundType(); + } + try { + byte sounddata[] = tagObj.getSwf().exportSound((Tag) tagObj); + final int soundRates[] = new int[]{5512, 11025, 22050, 44100}; + int frameRate = soundRates[soundRate]; + soundThread = new SoundThread(sounddata, exportFormat.equals("mp3"), (int) (sampleCount * (soundType ? 2 : 1)), frameRate * (soundType ? 2 : 1)); + imagePlayControls.setMedia(soundThread); + soundThread.play(); + + } catch (IOException ex) { + Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, "Cannot export Sound for playback", ex); + } + + } else if (((tagObj instanceof FrameNodeItem) && ((FrameNodeItem) tagObj).isDisplayed()) || ((tagObj instanceof CharacterTag) || (tagObj instanceof FontTag)) && (tagObj instanceof Tag) || (tagObj instanceof SoundStreamHeadTypeTag)) { ((CardLayout) viewerCards.getLayout()).show(viewerCards, FLASH_VIEWER_CARD); createAndShowTempSwf(tagObj); @@ -2582,7 +2774,7 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec List soundFrames = new ArrayList<>(); if (tagObj instanceof SoundStreamHeadTypeTag) { - SWF.populateSoundStreamBlocks(swf.tags, (Tag) tagObj, soundFrames); + soundFrames = ((SoundStreamHeadTypeTag) tagObj).getBlocks(); frameCount = soundFrames.size(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java b/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java index 75d708ef2..6815f8cd2 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java @@ -164,8 +164,7 @@ public class TagTreeModel implements TreeModel { for (int i = 0; i < sounds.size(); i++) { if (sounds.get(i).getItem() instanceof SoundStreamHeadTypeTag) { - List blocks = new ArrayList<>(); - SWF.populateSoundStreamBlocks(list, (Tag) sounds.get(i).getItem(), blocks); + List blocks = ((SoundStreamHeadTypeTag) sounds.get(i).getItem()).getBlocks(); if (blocks.isEmpty()) { sounds.remove(i); i--; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java index c4c2cbbbc..08b65cdb2 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java @@ -45,7 +45,7 @@ import java.util.concurrent.TimeoutException; * * @author JPEXS */ -public class FlashPlayerPanel extends Panel implements FlashDisplay { +public class FlashPlayerPanel extends Panel implements MediaDisplay { private boolean executed = false; private String flash; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashDisplay.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/MediaDisplay.java similarity index 93% rename from trunk/src/com/jpexs/decompiler/flash/gui/player/FlashDisplay.java rename to trunk/src/com/jpexs/decompiler/flash/gui/player/MediaDisplay.java index 2bff3a154..7190aa584 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashDisplay.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/MediaDisplay.java @@ -22,7 +22,7 @@ import java.awt.Color; * * @author JPEXS */ -public interface FlashDisplay { +public interface MediaDisplay { public int getCurrentFrame(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java index 993547465..a00cb970b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java @@ -46,7 +46,7 @@ public class PlayerControls extends JPanel implements ActionListener { private final JButton pauseButton; private boolean paused = false; - private final FlashDisplay display; + private MediaDisplay display; private JProgressBar progress; private final Timer timer; private final JLabel timeLabel; @@ -54,7 +54,7 @@ public class PlayerControls extends JPanel implements ActionListener { private static final Icon pauseIcon = View.getIcon("pause16"); private static final Icon playIcon = View.getIcon("play16"); - public PlayerControls(final FlashDisplay display) { + public PlayerControls(MediaDisplay display) { this.display = display; JPanel controlPanel = new JPanel(new BorderLayout()); timeLabel = new JLabel("00:00.00"); @@ -81,14 +81,15 @@ public class PlayerControls extends JPanel implements ActionListener { Dimension pref = progress.getPreferredSize(); pref.height = 20; progress.setPreferredSize(pref); + final PlayerControls t = this; progress.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { - int frame = (int) Math.floor(e.getX() * display.getTotalFrames() / (double) progress.getWidth()); + int frame = (int) Math.floor(e.getX() * t.display.getTotalFrames() / (double) progress.getWidth()); boolean p = paused; - display.gotoFrame(frame); + t.display.gotoFrame(frame); if (!p) { - display.play(); + t.display.play(); } } }); @@ -121,6 +122,10 @@ public class PlayerControls extends JPanel implements ActionListener { return ret; } + public void setMedia(MediaDisplay media) { + this.display = media; + } + private void update() { View.execInEventDispatch(new Runnable() { @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineSoundTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineSoundTag.java index 61c0879d8..c3e245d7f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineSoundTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineSoundTag.java @@ -115,6 +115,12 @@ public class DefineSoundTag extends CharacterTag { if (soundFormat == DefineSoundTag.FORMAT_ADPCM) { return "wav"; } + if (soundFormat == DefineSoundTag.FORMAT_UNCOMPRESSED_LITTLE_ENDIAN) { + return "wav"; + } + if (soundFormat == DefineSoundTag.FORMAT_UNCOMPRESSED_NATIVE_ENDIAN) { + return "wav"; + } return "flv"; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHead2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHead2Tag.java index 085b0cbf9..061ef60aa 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHead2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHead2Tag.java @@ -30,6 +30,8 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; /** * @@ -166,4 +168,12 @@ public class SoundStreamHead2Tag extends CharacterIdTag implements SoundStreamHe public boolean getSoundType() { return streamSoundType; } + + @Override + public List getBlocks() { + List ret = new ArrayList<>(); + SoundStreamHeadTag.populateSoundStreamBlocks(swf.tags, this, ret); + return ret; + + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHeadTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHeadTag.java index f385ac8b3..004c7a296 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHeadTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/SoundStreamHeadTag.java @@ -20,6 +20,8 @@ import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.tags.base.CharacterIdTag; +import com.jpexs.decompiler.flash.tags.base.Container; +import com.jpexs.decompiler.flash.tags.base.ContainerItem; import com.jpexs.decompiler.flash.tags.base.SoundStreamHeadTypeTag; import com.jpexs.decompiler.flash.types.BasicType; import com.jpexs.decompiler.flash.types.annotations.Conditional; @@ -30,6 +32,8 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; /** * @@ -157,4 +161,34 @@ public class SoundStreamHeadTag extends CharacterIdTag implements SoundStreamHea public boolean getSoundType() { return streamSoundType; } + + public static void populateSoundStreamBlocks(List tags, Tag head, List output) { + boolean found = false; + for (ContainerItem t : tags) { + if (t == head) { + found = true; + continue; + } + if (!found) { + continue; + } + if (t instanceof SoundStreamBlockTag) { + output.add((SoundStreamBlockTag) t); + } + if (t instanceof SoundStreamHeadTypeTag) { + break; + } + if (t instanceof Container) { + populateSoundStreamBlocks(((Container) t).getSubItems(), head, output); + } + } + } + + @Override + public List getBlocks() { + List ret = new ArrayList<>(); + populateSoundStreamBlocks(swf.tags, this, ret); + return ret; + + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/base/SoundStreamHeadTypeTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/base/SoundStreamHeadTypeTag.java index 12a8b66d2..20a9a3613 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/base/SoundStreamHeadTypeTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/base/SoundStreamHeadTypeTag.java @@ -16,6 +16,9 @@ */ package com.jpexs.decompiler.flash.tags.base; +import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; +import java.util.List; + /** * * @author JPEXS @@ -37,4 +40,6 @@ public interface SoundStreamHeadTypeTag { public int getCharacterId(); public String getExportFormat(); + + public List getBlocks(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java b/trunk/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java index 129c5cc44..ac7a94c62 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/sound/MP3FRAME.java @@ -18,8 +18,12 @@ package com.jpexs.decompiler.flash.types.sound; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFInputStream; +import com.jpexs.decompiler.flash.SWFOutputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -40,6 +44,7 @@ public class MP3FRAME { public boolean copyright; public boolean original; public int emphasis; + public byte[] sampleData; public MP3FRAME(InputStream is) throws IOException { SWFInputStream sis = new SWFInputStream(is, SWF.DEFAULT_VERSION); @@ -53,7 +58,36 @@ public class MP3FRAME { reserved = (int) sis.readUB(1); channelMode = (int) sis.readUB(2); modelExtension = (int) sis.readUB(2); - //TODO:read sample data + + int size = getSampleDataSize(); + int sizeBytes = (int) Math.ceil((double) size / 8.0); + sampleData = sis.readBytes(sizeBytes); + } + + public byte[] getData() { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + SWFOutputStream sos = new SWFOutputStream(baos, SWF.DEFAULT_VERSION); + sos.writeUB(11, syncWord); + sos.writeUB(1, mpegVersion); + sos.writeUB(2, layer); + sos.writeUB(1, protectionBit ? 1 : 0); + sos.writeUB(4, bitRate); + sos.writeUB(2, samplingRate); + sos.writeUB(1, paddingBit ? 1 : 0); + sos.writeUB(1, reserved); + sos.writeUB(2, channelMode); + sos.writeUB(2, modelExtension); + sos.write(sampleData); + return baos.toByteArray(); + } catch (IOException ex) { + Logger.getLogger(MP3FRAME.class.getName()).log(Level.SEVERE, null, ex); + } + return null; + } + + private int getSampleDataSize() { + return (((isMPEG1() ? 144 : 72) * bitRate) / samplingRate) + (paddingBit ? 1 : 0) - 4; } public boolean isMPEG2() { diff --git a/trunk/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java b/trunk/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java new file mode 100644 index 000000000..65668a1c0 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/types/sound/MP3SOUNDDATA.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.types.sound; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.SWFInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class MP3SOUNDDATA { + + public int seekSamples; + public List frames; + + public MP3SOUNDDATA(InputStream is) throws IOException { + SWFInputStream sis = new SWFInputStream(is, SWF.DEFAULT_VERSION); + seekSamples = sis.readUI16(); + frames = new ArrayList<>(); + while (sis.available() > 0) { + frames.add(new MP3FRAME(sis)); + } + } +} diff --git a/trunk/src/com/jpexs/helpers/sound/MP3Player.java b/trunk/src/com/jpexs/helpers/sound/MP3Player.java new file mode 100644 index 000000000..360d7e36c --- /dev/null +++ b/trunk/src/com/jpexs/helpers/sound/MP3Player.java @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.helpers.sound; + +/** + * + * @author JPEXS + */ +import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; +import javazoom.jl.decoder.Bitstream; +import javazoom.jl.decoder.Decoder; +import javazoom.jl.decoder.Header; +import javazoom.jl.decoder.JavaLayerException; +import javazoom.jl.decoder.SampleBuffer; +import javazoom.jl.player.AudioDevice; +import javazoom.jl.player.FactoryRegistry; + +public class MP3Player extends SoundPlayer { + + private Bitstream bitstream; + + private Decoder decoder; + + private AudioDevice audio; + + private boolean closed = false; + + private boolean complete = false; + + private int positionSamples = 0; + private long sampleCount; + private int frameRate; + + public MP3Player(InputStream stream, long sampleCount, int frameRate) throws JavaLayerException { + this(stream, null); + this.sampleCount = sampleCount; + this.frameRate = frameRate; + } + + private MP3Player(InputStream stream, AudioDevice device) throws JavaLayerException { + super(stream); + bitstream = new Bitstream(stream); + decoder = new Decoder(); + + if (device != null) { + audio = device; + } else { + FactoryRegistry r = FactoryRegistry.systemRegistry(); + audio = r.createAudioDevice(); + } + audio.open(decoder); + } + + @Override + public void play() { + try { + play(Integer.MAX_VALUE); + } catch (JavaLayerException ex) { + Logger.getLogger(MP3Player.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private boolean play(int frames) throws JavaLayerException { + if (complete) { + return false; + } + boolean ret = true; + + while (frames-- > 0 && ret) { + ret = decodeFrame(); + } + + if (!ret) { + // last frame, ensure all data flushed to the audio device. + AudioDevice out = audio; + if (out != null) { + out.flush(); + synchronized (this) { + complete = (!closed); + stop(); + } + } + } + return ret; + } + + @Override + public synchronized void skip(long samples) { + if (complete) { + return; + } + long endPosition = positionSamples + samples; + if (samples == 0) { + return; + } + try { + while (true) { + Header h = bitstream.readFrame(); + if (h == null) { + complete = true; + return; + } + SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream); + positionSamples += output.getBufferLength(); + bitstream.closeFrame(); + if (positionSamples >= endPosition) { + break; + } + } + } catch (Exception ex) { + //ingore + } + + } + + @Override + public synchronized void stop() { + AudioDevice out = audio; + if (out != null) { + closed = true; + audio = null; + out.close(); + } + } + + @Override + public synchronized boolean isPlaying() { + return !complete; + } + + @Override + public long getSamplePosition() { + return positionSamples; + } + + private boolean decodeFrame() throws JavaLayerException { + try { + AudioDevice out = audio; + if (out == null) { + return false; + } + + Header h = bitstream.readFrame(); + if (h == null) { + return false; + } + + SampleBuffer output = (SampleBuffer) decoder.decodeFrame(h, bitstream); + positionSamples += output.getBufferLength(); + + synchronized (this) { + out = audio; + if (out != null) { + out.write(output.getBuffer(), 0, output.getBufferLength()); + } + } + + bitstream.closeFrame(); + } catch (RuntimeException ex) { + return true; + } + return true; + } + + @Override + public long samplesCount() { + return sampleCount; + } + + @Override + public long getFrameRate() { + return frameRate; + } + +} diff --git a/trunk/src/com/jpexs/helpers/sound/SoundPlayer.java b/trunk/src/com/jpexs/helpers/sound/SoundPlayer.java new file mode 100644 index 000000000..ee448903d --- /dev/null +++ b/trunk/src/com/jpexs/helpers/sound/SoundPlayer.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.helpers.sound; + +import java.io.InputStream; + +/** + * + * @author JPEXS + */ +public abstract class SoundPlayer { + + protected InputStream is; + + protected SoundPlayer(InputStream is) { + this.is = is; + } + + public abstract long samplesCount(); + + public abstract long getSamplePosition(); + + public abstract void play(); + + public abstract void stop(); + + public abstract void skip(long samples); + + public abstract boolean isPlaying(); + + public abstract long getFrameRate(); + +} diff --git a/trunk/src/com/jpexs/helpers/sound/WavPlayer.java b/trunk/src/com/jpexs/helpers/sound/WavPlayer.java new file mode 100644 index 000000000..5174373f4 --- /dev/null +++ b/trunk/src/com/jpexs/helpers/sound/WavPlayer.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.helpers.sound; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.Line; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.UnsupportedAudioFileException; + +/** + * + * @author JPEXS + */ +public class WavPlayer extends SoundPlayer { + + private Clip clip; + private boolean complete = false; + private long startPos = 0; + + public WavPlayer(InputStream is) { + super(is); + try { + clip = (Clip) AudioSystem.getLine(new Line.Info(Clip.class)); + } catch (LineUnavailableException ex) { + Logger.getLogger(WavPlayer.class.getName()).log(Level.SEVERE, null, ex); + } + + if (clip == null) { + return; + } + try { + clip.open(AudioSystem.getAudioInputStream(new BufferedInputStream(is))); + } catch (LineUnavailableException | IOException | UnsupportedAudioFileException ex) { + Logger.getLogger(WavPlayer.class.getName()).log(Level.SEVERE, "Error opening", ex); + clip = null; + } + } + + @Override + public long samplesCount() { + return clip.getMicrosecondLength(); + } + + @Override + public void play() { + if (clip == null) { + return; + } + clip.setMicrosecondPosition(startPos);//startPos); + final WavPlayer t = this; + clip.addLineListener(new LineListener() { + + @Override + public void update(LineEvent event) { + if (event.getType() == LineEvent.Type.STOP) { + complete = true; + startPos = 0; + clip.close(); + synchronized (t) { + t.notifyAll(); + } + } + } + }); + clip.start(); + try { + synchronized (this) { + wait(); + } + } catch (InterruptedException ex) { + //Ignore + } + + } + + @Override + public long getSamplePosition() { + return clip.getMicrosecondPosition(); + } + + @Override + public void skip(long frames) { + startPos = getSamplePosition() + frames; + } + + @Override + public void stop() { + clip.stop(); + } + + @Override + public boolean isPlaying() { + return !complete; + } + + @Override + public long getFrameRate() { + return 1000000L; + } + +}