/* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * MasterPanel.java * * Created on 4-Apr-2012, 6:52:17 PM */ package webcamstudio.components; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; import javax.sound.sampled.LineUnavailableException; import javax.swing.SpinnerNumberModel; import webcamstudio.FullScreen; import webcamstudio.WSPreview; import webcamstudio.WebcamStudio; import webcamstudio.channels.MasterChannels; import static webcamstudio.components.ChannelPanel.listenerCPOP; import webcamstudio.mixers.Frame; import webcamstudio.mixers.MasterMixer; import webcamstudio.mixers.PrePlayer; import webcamstudio.mixers.PreviewMixer; import webcamstudio.mixers.SystemPlayer; import webcamstudio.streams.SourceChannel; import webcamstudio.streams.SourceImage; import webcamstudio.streams.SourceText; import webcamstudio.streams.Stream; import webcamstudio.util.Tools; /** * * @author patrick (modified by karl) */ public class MasterPanel extends javax.swing.JPanel implements MasterMixer.SinkListener, FullScreen.Listener, ChannelPanel.Listener, WSPreview.Listener, PreviewMixer.SinkListener { protected Viewer viewer = new Viewer(); protected PreViewer preViewer = new PreViewer(); private SystemPlayer player = null; private PrePlayer prePlayer = null; private final MasterMixer mixer = MasterMixer.getInstance(); private final PreviewMixer preMixer = PreviewMixer.getInstance(); MasterChannels master = MasterChannels.getInstance(); final static public Dimension PANEL_SIZE = new Dimension(150, 400); final static public Dimension smallPANEL_SIZE = new Dimension(240, 125); ArrayList<Stream> streamM = MasterChannels.getInstance().getStreams(); Stream stream = null; SourceText sTx = null; SourceImage sImg = null; boolean lockRatio = false; private BufferedImage liveImg = null; int opacity = 75; public static float masterVolume = 0f; /** Creates new form MasterPanel */ public MasterPanel() { initComponents(); jslOpacity.setValue(75); lblCurtain.setVisible(false); spinFPS.setModel(new SpinnerNumberModel(5, 5, 30, 5)); spinWidth.setValue(mixer.getWidth()); spinHeight.setValue(mixer.getHeight()); this.setVisible(true); viewer.setOpaque(true); panelPreview.add(viewer, BorderLayout.CENTER); panelPreviewer.remove(preViewer); lblCurtainPre.setOpaque(true); lblCurtainPre.setVisible(true); panelPreviewer.add(lblCurtainPre); player = SystemPlayer.getInstance(viewer); prePlayer = PrePlayer.getPreInstance(preViewer); mixer.register(this); preMixer.register(this); spinFPS.setValue(MasterMixer.getInstance().getRate()); final MasterPanel instanceSinkMP = this; FullScreen.setListenerFS(instanceSinkMP); WSPreview.setListenerPW(instanceSinkMP); ChannelPanel.setListenerCPMPanel(instanceSinkMP); panPreview.setLayout(null); panPreview.validate(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { panelPreview = new javax.swing.JPanel(); lblCurtain = new javax.swing.JLabel(); tabMixers = new javax.swing.JTabbedPane(); panMixer = new javax.swing.JPanel(); lblWidth = new javax.swing.JLabel(); lblHeight = new javax.swing.JLabel(); spinWidth = new javax.swing.JSpinner(); spinHeight = new javax.swing.JSpinner(); btnApply = new javax.swing.JButton(); lblHeight1 = new javax.swing.JLabel(); spinFPS = new javax.swing.JSpinner(); btnApplyToStreams = new javax.swing.JButton(); btnFullScreen = new javax.swing.JButton(); tglLockRatio = new javax.swing.JToggleButton(); tglSound = new javax.swing.JToggleButton(); sldMasterVolume = new javax.swing.JSlider(); jLabel3 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); panPreview = new javax.swing.JPanel(); btnPreview = new javax.swing.JButton(); lblHeight2 = new javax.swing.JLabel(); panelPreviewer = new javax.swing.JPanel(); lblCurtainPre = new javax.swing.JLabel(); jslOpacity = new javax.swing.JSlider(); jLabel1 = new javax.swing.JLabel(); setBorder(javax.swing.BorderFactory.createTitledBorder("LiVE View")); setMaximumSize(new java.awt.Dimension(2147483647, 2147483647)); setMinimumSize(new java.awt.Dimension(273, 380)); setPreferredSize(new java.awt.Dimension(273, 400)); setLayout(new java.awt.BorderLayout()); panelPreview.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)); panelPreview.setToolTipText("Click on the video to Hide (Less CPU Usage)"); panelPreview.setMaximumSize(new java.awt.Dimension(180, 120)); panelPreview.setMinimumSize(new java.awt.Dimension(180, 120)); panelPreview.setName("panelPreview"); // NOI18N panelPreview.setPreferredSize(new java.awt.Dimension(180, 120)); panelPreview.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { panelPreviewMouseClicked(evt); } }); panelPreview.setLayout(new java.awt.BorderLayout()); lblCurtain.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/curtain.png"))); // NOI18N lblCurtain.setToolTipText("Click on the curtain to Unhide"); lblCurtain.setName("lblCurtain"); // NOI18N lblCurtain.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { lblCurtainMouseClicked(evt); } }); panelPreview.add(lblCurtain, java.awt.BorderLayout.CENTER); add(panelPreview, java.awt.BorderLayout.NORTH); tabMixers.setName("tabMixers"); // NOI18N tabMixers.setPreferredSize(new java.awt.Dimension(257, 300)); panMixer.setName("panMixer"); // NOI18N panMixer.setPreferredSize(new java.awt.Dimension(251, 216)); java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("webcamstudio/Languages"); // NOI18N lblWidth.setText(bundle.getString("WIDTH")); // NOI18N lblWidth.setName("lblWidth"); // NOI18N lblHeight.setText(bundle.getString("HEIGHT")); // NOI18N lblHeight.setName("lblHeight"); // NOI18N spinWidth.setName("spinWidth"); // NOI18N spinWidth.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinWidthStateChanged(evt); } }); spinHeight.setName("spinHeight"); // NOI18N btnApply.setText(bundle.getString("APPLY")); // NOI18N btnApply.setToolTipText("Apply/Reset Mixer Settings"); btnApply.setName("btnApply"); // NOI18N btnApply.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnApplyActionPerformed(evt); } }); lblHeight1.setText(bundle.getString("FRAMERATE")); // NOI18N lblHeight1.setName("lblHeight1"); // NOI18N spinFPS.setName("spinFPS"); // NOI18N btnApplyToStreams.setText("Apply to Streams"); btnApplyToStreams.setToolTipText("Apply Mixer Settings Proportionally to all Streams."); btnApplyToStreams.setName("btnApplyToStreams"); // NOI18N btnApplyToStreams.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnApplyToStreamsActionPerformed(evt); } }); btnFullScreen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/view-fullscreen.png"))); // NOI18N btnFullScreen.setToolTipText("WebcamStudio LiVE View Window"); btnFullScreen.setMinimumSize(new java.awt.Dimension(0, 0)); btnFullScreen.setName("btnFullScreen"); // NOI18N btnFullScreen.setPreferredSize(new java.awt.Dimension(20, 20)); btnFullScreen.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnFullScreenActionPerformed(evt); } }); tglLockRatio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/LockButton-open_small.png"))); // NOI18N tglLockRatio.setText("A/R"); tglLockRatio.setToolTipText("Lock Mixer Aspect Ratio"); tglLockRatio.setName("tglLockRatio"); // NOI18N tglLockRatio.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/LockButton-open_small.png"))); // NOI18N tglLockRatio.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/LockButton-close_small.png"))); // NOI18N tglLockRatio.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tglLockRatioActionPerformed(evt); } }); tglSound.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/audio-card.png"))); // NOI18N tglSound.setToolTipText("Java Sound AudioSystem Out (Unstable)"); tglSound.setName("tglSound"); // NOI18N tglSound.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { tglSoundActionPerformed(evt); } }); sldMasterVolume.setMajorTickSpacing(50); sldMasterVolume.setMinimum(-100); sldMasterVolume.setMinorTickSpacing(10); sldMasterVolume.setPaintTicks(true); sldMasterVolume.setSnapToTicks(true); sldMasterVolume.setToolTipText("WS Master Volume"); sldMasterVolume.setValue(0); sldMasterVolume.setName("sldMasterVolume"); // NOI18N sldMasterVolume.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sldMasterVolumeStateChanged(evt); } }); jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/volume_icon_25.png"))); // NOI18N jLabel3.setName("jLabel3"); // NOI18N jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setText("0"); jLabel2.setName("jLabel2"); // NOI18N javax.swing.GroupLayout panMixerLayout = new javax.swing.GroupLayout(panMixer); panMixer.setLayout(panMixerLayout); panMixerLayout.setHorizontalGroup( panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panMixerLayout.createSequentialGroup() .addContainerGap() .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panMixerLayout.createSequentialGroup() .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblHeight1) .addComponent(lblWidth) .addComponent(lblHeight)) .addGap(14, 14, 14) .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(spinFPS) .addGroup(panMixerLayout.createSequentialGroup() .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(spinHeight, javax.swing.GroupLayout.DEFAULT_SIZE, 90, Short.MAX_VALUE) .addComponent(spinWidth)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tglLockRatio, javax.swing.GroupLayout.DEFAULT_SIZE, 58, Short.MAX_VALUE)))) .addGroup(panMixerLayout.createSequentialGroup() .addComponent(btnFullScreen, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tglSound, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panMixerLayout.createSequentialGroup() .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(sldMasterVolume, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(panMixerLayout.createSequentialGroup() .addComponent(btnApply, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnApplyToStreams, javax.swing.GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE))) .addContainerGap()) ); panMixerLayout.setVerticalGroup( panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panMixerLayout.createSequentialGroup() .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(panMixerLayout.createSequentialGroup() .addContainerGap() .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(spinWidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblWidth)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(spinHeight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHeight))) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panMixerLayout.createSequentialGroup() .addGap(19, 19, 19) .addComponent(tglLockRatio))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(spinFPS, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblHeight1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tglSound, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnFullScreen, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(sldMasterVolume, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panMixerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnApplyToStreams, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(btnApply, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); tabMixers.addTab(bundle.getString("MIXER"), panMixer); // NOI18N panPreview.setName("panPreview"); // NOI18N panPreview.setPreferredSize(new java.awt.Dimension(242, 279)); panPreview.setLayout(null); btnPreview.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/tango/PreviewButton2.png"))); // NOI18N btnPreview.setToolTipText("WebcamStudio Preview Window"); btnPreview.setMinimumSize(new java.awt.Dimension(0, 0)); btnPreview.setName("btnPreview"); // NOI18N btnPreview.setPreferredSize(new java.awt.Dimension(20, 20)); btnPreview.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnPreviewActionPerformed(evt); } }); panPreview.add(btnPreview); btnPreview.setBounds(0, 153, 28, 28); lblHeight2.setFont(new java.awt.Font("Ubuntu", 1, 14)); // NOI18N lblHeight2.setText(bundle.getString("FAST PREVIEW")); // NOI18N lblHeight2.setName("lblHeight2"); // NOI18N panPreview.add(lblHeight2); lblHeight2.setBounds(73, 8, 90, 16); panelPreviewer.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)); panelPreviewer.setToolTipText("Click on the video to Hide"); panelPreviewer.setMaximumSize(new java.awt.Dimension(180, 120)); panelPreviewer.setMinimumSize(new java.awt.Dimension(180, 120)); panelPreviewer.setName("panelPreviewer"); // NOI18N panelPreviewer.setPreferredSize(new java.awt.Dimension(180, 120)); panelPreviewer.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { panelPreviewerMouseClicked(evt); } }); panelPreviewer.setLayout(new java.awt.BorderLayout()); lblCurtainPre.setIcon(new javax.swing.ImageIcon(getClass().getResource("/webcamstudio/resources/curtain.png"))); // NOI18N lblCurtainPre.setToolTipText("Click on the curtain to Unhide"); lblCurtainPre.setName("lblCurtainPre"); // NOI18N lblCurtainPre.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { lblCurtainPreMouseClicked(evt); } }); panelPreviewer.add(lblCurtainPre, java.awt.BorderLayout.CENTER); panPreview.add(panelPreviewer); panelPreviewer.setBounds(0, 28, 244, 121); jslOpacity.setName("jslOpacity"); // NOI18N jslOpacity.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { jslOpacityStateChanged(evt); } }); panPreview.add(jslOpacity); jslOpacity.setBounds(30, 153, 198, 30); jLabel1.setText("Fader"); jLabel1.setName("jLabel1"); // NOI18N panPreview.add(jLabel1); jLabel1.setBounds(110, 147, 40, 17); tabMixers.addTab("Preview", panPreview); add(tabMixers, java.awt.BorderLayout.CENTER); tabMixers.getAccessibleContext().setAccessibleName(bundle.getString("MIXER")); // NOI18N }// </editor-fold>//GEN-END:initComponents public void releaseTglButton(){ } public void applyLoadedMixer(){ int w = (Integer) spinWidth.getValue(); int h = (Integer) spinHeight.getValue(); mixer.stop(); mixer.setWidth(w); mixer.setHeight(h); mixer.setRate((Integer) spinFPS.getValue()); MasterMixer.getInstance().start(); preMixer.stop(); preMixer.setWidth(w); preMixer.setHeight(h); PreviewMixer.getInstance().start(); } private void btnApplyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnApplyActionPerformed SystemPlayer.getInstance(null).stop(); Tools.sleep(30); PrePlayer.getPreInstance(null).stop(); Tools.sleep(10); MasterChannels.getInstance().stopAllStream(); for (Stream s : streamM){ s.updateStatus(); } Tools.sleep(30); listenerCPOP.resetButtonsStates(evt); ChannelPanel.btnStopOnlyStream.doClick(); int w = (Integer) spinWidth.getValue(); int h = (Integer) spinHeight.getValue(); mixer.stop(); preMixer.stop(); mixer.setWidth(w); preMixer.setWidth(w); mixer.setHeight(h); preMixer.setHeight(h); mixer.setRate((Integer) spinFPS.getValue()); mixer.start(); preMixer.start(); for (Stream s : streamM){ String streamName =s.getClass().getName(); // System.out.println("StreamName: "+streamName); if (streamName.contains("SinkFile") || streamName.contains("SinkUDP")){ // System.out.println("Sink New Size: "+w+"x"+h); s.setWidth(w); s.setHeight(h); s.updateStatus(); } } listenerCPOP.resetButtonsStates(evt); ResourceMonitorLabel label = new ResourceMonitorLabel(System.currentTimeMillis()+10000, "New Mixer Settings Applied"); ResourceMonitor.getInstance().addMessage(label); }//GEN-LAST:event_btnApplyActionPerformed private void btnApplyToStreamsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnApplyToStreamsActionPerformed ArrayList<Stream> allStreams = MasterChannels.getInstance().getStreams(); int wi = mixer.getWidth(); int he = mixer.getHeight(); int oldCW; int oldCH; for (Stream oneStream : allStreams) { if (!oneStream.getClass().toString().contains("Sink")){ // Don't Update SinkStreams // System.out.println("Processing "+oneStream.getName()+": ..."); if (oneStream instanceof SourceText) { sTx = (SourceText) oneStream; oldCW = sTx.getTextCW(); oldCH = sTx.getTextCH(); } else if (oneStream instanceof SourceImage) { sImg = (SourceImage) oneStream; oldCW = sImg.getImgCW(); oldCH = sImg.getImgCH(); } else { oldCW = oneStream.getCaptureWidth(); oldCH = oneStream.getCaptureHeight(); } // System.out.println("oldCW: "+oldCW); // System.out.println("oldCH: "+oldCH); int oldW = oneStream.getWidth(); // System.out.println("oldW: "+oldW); int oldH = oneStream.getHeight(); // System.out.println("oldH: "+oldH); int oldX = oneStream.getX(); // System.out.println("oldX: "+oldX); int oldY = oneStream.getY(); // System.out.println("oldY: "+oldY); int newW = (oldW * wi) / oldCW; // System.out.println("newW: "+newW); int newH = (oldH * he) / oldCH; // System.out.println("newH: "+newH); int newX = (oldX * wi) / oldCW; // System.out.println("newX: "+newX); int newY = (oldY * he) / oldCH; // System.out.println("newY: "+newY); if (oneStream instanceof SourceText) { oneStream.setWidth(newW); oneStream.setHeight(newH); oneStream.setX(newX); oneStream.setY(newY); oneStream.setCaptureWidth(newW); oneStream.setCaptureHeight(newH); sTx.setTextCW(wi); sTx.setTextCH(he); // System.out.println(oneStream.getName()+" UpdateStatus !!!"); oneStream.updateStatus(); for (SourceChannel ssc : oneStream.getChannels()) { ssc.setWidth(newW); ssc.setHeight(newH); ssc.setX(newX); ssc.setY(newY); ssc.setCapWidth(newW); ssc.setCapHeight(newH); } } else if (oneStream instanceof SourceImage) { oneStream.setWidth(newW); oneStream.setHeight(newH); // System.out.println(oneStream.getName()+" Height:"+newH); oneStream.setX(newX); oneStream.setY(newY); oneStream.setCaptureWidth(newW); oneStream.setCaptureHeight(newH); sImg.setImgCW(wi); sImg.setImgCH(he); // System.out.println(oneStream.getName()+" UpdateStatus !!!"); oneStream.updateStatus(); for (SourceChannel ssc : oneStream.getChannels()) { ssc.setWidth(newW); ssc.setHeight(newH); ssc.setX(newX); ssc.setY(newY); ssc.setCapWidth(newW); ssc.setCapHeight(newH); } } else { oneStream.setWidth(newW); oneStream.setHeight(newH); oneStream.setX(newX); oneStream.setY(newY); oneStream.setCaptureWidth(wi); oneStream.setCaptureHeight(he); // System.out.println(oneStream.getName()+" UpdateStatus !!!"); oneStream.updateStatus(); for (SourceChannel ssc : oneStream.getChannels()) { ssc.setWidth(newW); ssc.setHeight(newH); ssc.setX(newX); ssc.setY(newY); ssc.setCapWidth(wi); ssc.setCapHeight(he); } } } } ResourceMonitorLabel label = new ResourceMonitorLabel(System.currentTimeMillis()+10000, "Mixer Settings Applied To All Streams"); ResourceMonitor.getInstance().addMessage(label); }//GEN-LAST:event_btnApplyToStreamsActionPerformed private void btnFullScreenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFullScreenActionPerformed btnFullScreen.setEnabled(false); FullScreen window = new FullScreen(); StreamFullScreen frame = new StreamFullScreen(viewer); window.add(frame, javax.swing.JLayeredPane.DEFAULT_LAYER); panelPreview.remove(viewer); lblCurtain.setOpaque(true); lblCurtain.setVisible(true); panelPreview.add(lblCurtain); try { frame.setSelected(true); frame.setMaximum(true); } catch (PropertyVetoException ex) { Logger.getLogger(WebcamStudio.class.getName()).log(Level.SEVERE, null, ex); } window.setLocationRelativeTo(WebcamStudio.cboAnimations); window.setAlwaysOnTop(true); window.setVisible(true); }//GEN-LAST:event_btnFullScreenActionPerformed private void tglLockRatioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tglLockRatioActionPerformed if (tglLockRatio.isSelected()){ spinHeight.setEnabled(false); lockRatio = true; } else { spinHeight.setEnabled(true); lockRatio = false; } }//GEN-LAST:event_tglLockRatioActionPerformed private void spinWidthStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinWidthStateChanged int oldW = mixer.getWidth(); int oldH = mixer.getHeight(); int w = (Integer) spinWidth.getValue(); int h; if (tglLockRatio.isSelected()){ h = (oldH * w) / oldW; spinHeight.setValue(h); } }//GEN-LAST:event_spinWidthStateChanged private void tglSoundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tglSoundActionPerformed if (tglSound.isSelected()) { try { player.play(); } catch (LineUnavailableException ex) { Logger.getLogger(MasterPanel.class.getName()).log(Level.SEVERE, null, ex); } } else { player.stop(); } }//GEN-LAST:event_tglSoundActionPerformed private void lblCurtainMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblCurtainMouseClicked lblCurtain.setVisible(false); viewer.setOpaque(true); panelPreview.add(viewer, BorderLayout.CENTER); player = SystemPlayer.getInstance(viewer); this.repaint(); this.revalidate(); btnFullScreen.setEnabled(true); }//GEN-LAST:event_lblCurtainMouseClicked private void panelPreviewMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_panelPreviewMouseClicked panelPreview.remove(viewer); lblCurtain.setOpaque(true); lblCurtain.setVisible(true); panelPreview.add(lblCurtain); this.repaint(); this.revalidate(); }//GEN-LAST:event_panelPreviewMouseClicked private void btnPreviewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPreviewActionPerformed btnPreview.setEnabled(false); WSPreview window = new WSPreview(); WSPreviewScreen frame = new WSPreviewScreen(preViewer); window.add(frame, javax.swing.JLayeredPane.DEFAULT_LAYER); panelPreviewer.remove(preViewer); lblCurtainPre.setOpaque(true); lblCurtainPre.setVisible(true); panelPreviewer.add(lblCurtainPre); try { frame.setSelected(true); frame.setMaximum(true); } catch (PropertyVetoException ex) { Logger.getLogger(WebcamStudio.class.getName()).log(Level.SEVERE, null, ex); } window.setLocationRelativeTo(WebcamStudio.cboAnimations); window.setAlwaysOnTop(true); window.setVisible(true); }//GEN-LAST:event_btnPreviewActionPerformed private void lblCurtainPreMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblCurtainPreMouseClicked lblCurtainPre.setVisible(false); preViewer.setOpaque(true); panelPreviewer.add(preViewer, BorderLayout.CENTER); prePlayer = PrePlayer.getPreInstance(preViewer); this.repaint(); this.revalidate(); btnFullScreen.setEnabled(true); }//GEN-LAST:event_lblCurtainPreMouseClicked private void panelPreviewerMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_panelPreviewerMouseClicked panelPreviewer.remove(preViewer); lblCurtainPre.setOpaque(true); lblCurtainPre.setVisible(true); panelPreviewer.add(lblCurtainPre); this.repaint(); this.revalidate(); }//GEN-LAST:event_panelPreviewerMouseClicked private void jslOpacityStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jslOpacityStateChanged opacity = jslOpacity.getValue(); }//GEN-LAST:event_jslOpacityStateChanged private void sldMasterVolumeStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldMasterVolumeStateChanged Object value = sldMasterVolume.getValue(); float v = 0; String volText = "0"; if (value instanceof Float){ v = (Float)value; } else if (value instanceof Integer){ v = ((Number)value).floatValue(); volText = value.toString(); } jLabel2.setText(volText); masterVolume = v/100f; }//GEN-LAST:event_sldMasterVolumeStateChanged /** * * @param evt */ @Override public void resetViewer(ActionEvent evt){ lblCurtain.setVisible(false); viewer.setOpaque(true); panelPreview.add(viewer, BorderLayout.CENTER); player = SystemPlayer.getInstance(viewer); btnFullScreen.setEnabled(true); this.repaint(); this.revalidate(); } /** * * @param evt */ @Override public void resetPreviewer(ActionEvent evt){ lblCurtainPre.setVisible(false); preViewer.setOpaque(true); panelPreviewer.add(preViewer, BorderLayout.CENTER); prePlayer = PrePlayer.getPreInstance(preViewer); btnPreview.setEnabled(true); this.repaint(); this.revalidate(); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnApply; private javax.swing.JButton btnApplyToStreams; private javax.swing.JButton btnFullScreen; private javax.swing.JButton btnPreview; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JSlider jslOpacity; private javax.swing.JLabel lblCurtain; private javax.swing.JLabel lblCurtainPre; private javax.swing.JLabel lblHeight; private javax.swing.JLabel lblHeight1; private javax.swing.JLabel lblHeight2; private javax.swing.JLabel lblWidth; private javax.swing.JPanel panMixer; private javax.swing.JPanel panPreview; private javax.swing.JPanel panelPreview; private javax.swing.JPanel panelPreviewer; private javax.swing.JSlider sldMasterVolume; public static javax.swing.JSpinner spinFPS; public static javax.swing.JSpinner spinHeight; public static javax.swing.JSpinner spinWidth; private javax.swing.JTabbedPane tabMixers; private javax.swing.JToggleButton tglLockRatio; private javax.swing.JToggleButton tglSound; // End of variables declaration//GEN-END:variables @Override public void newFrame(Frame frame) { player.addFrame(frame); liveImg = frame.getImage(); } BufferedImage deepCopy(BufferedImage bi) { if (bi != null) { ColorModel cm = bi.getColorModel(); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); WritableRaster raster = bi.copyData(null); BufferedImage temp = new BufferedImage(cm, raster, isAlphaPremultiplied, null); return temp; } else { return null; } } @Override public void newPreFrame(Frame frame) { BufferedImage img = deepCopy(frame.getImage()); BufferedImage lImg = deepCopy(liveImg); if (lImg != null) { Graphics2D buffer = lImg.createGraphics(); buffer.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); buffer.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED); buffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); buffer.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); buffer.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF); buffer.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED); buffer.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); buffer.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, opacity / 100F)); buffer.drawImage(img, 0, 0, null); buffer.dispose(); frame.setImage(lImg); } prePlayer.addFrame(frame); } @Override public void requestReset() { // System.out.println("Apply buttton pressed ..."); btnApply.doClick(); } @Override public void resetButtonsStates(ActionEvent evt) { // nothing here } @Override public void requestStart() { // nothing here } @Override public void requestStop() { // nothing here } }