Author: solomax
Date: Sun May 13 03:38:42 2012
New Revision: 1337762
URL: http://svn.apache.org/viewvc?rev=1337762&view=rev
Log:
OPENMEETINGS-266 functional changes, stream publishing seems to work as expected
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/red5/ScopeApplicationAdapter.java
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/CoreScreenShare.java
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/gui/ScreenSharerFrame.java
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/red5/ScopeApplicationAdapter.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/red5/ScopeApplicationAdapter.java?rev=1337762&r1=1337761&r2=1337762&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/red5/ScopeApplicationAdapter.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/red5/ScopeApplicationAdapter.java
Sun May 13 03:38:42 2012
@@ -53,6 +53,7 @@ import org.openmeetings.app.remote.White
import org.openmeetings.utils.math.CalendarPatterns;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.adapter.ApplicationAdapter;
+import org.red5.server.api.IBasicScope;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
@@ -61,6 +62,12 @@ import org.red5.server.api.service.IPend
import org.red5.server.api.service.IPendingServiceCallback;
import org.red5.server.api.service.IServiceCapableConnection;
import org.red5.server.api.stream.IBroadcastStream;
+import org.red5.server.api.stream.IStreamListener;
+import org.red5.server.api.stream.IStreamPacket;
+import org.red5.server.net.rtmp.event.IRTMPEvent;
+import org.red5.server.stream.IBroadcastScope;
+import org.red5.server.stream.StreamingProxy;
+import org.red5.server.stream.message.RTMPMessage;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -96,6 +103,7 @@ public class ScopeApplicationAdapter ext
@Autowired
private MeetingMemberDaoImpl meetingMemberDao;
+ private Map<String, StreamingProxy> streamingProxyMap = new
HashMap<String, StreamingProxy>();
// This is the Folder where all executables are written
// for windows platform
public static String batchFileFir = "webapps" + File.separatorChar +
"ROOT"
@@ -120,10 +128,6 @@ public class ScopeApplicationAdapter ext
@Override
public synchronized boolean appStart(IScope scope) {
try {
- // This System out is for testing SLF4J / LOG4J and
custom logging n
- // Red5
- // System.out.println("Custom Webapp start UP "+new
Date());
-
webAppPath =
scope.getResource("/").getFile().getAbsolutePath();
batchFileFir = webAppPath + File.separatorChar +
OpenmeetingsVariables.STREAMS_DIR
+ File.separatorChar;
@@ -229,34 +233,23 @@ public class ScopeApplicationAdapter ext
if (currentClient != null) {
- boolean stopStreaming = Boolean.valueOf(map
-
.get("stopStreaming").toString());
- boolean stopRecording = Boolean.valueOf(map
-
.get("stopRecording").toString());
-
- if (stopStreaming) {
-
+ if
(Boolean.valueOf(map.get("stopStreaming").toString())) {
log.debug("start streamPublishStart Is
Screen Sharing -- Stop ");
//Send message to all users
syncMessageToCurrentScope("stopRed5ScreenSharing", currentClient, false);
if (currentClient.isStartRecording()) {
-
returnMap.put("result",
"stopSharingOnly");
-
}
currentClient.setStartStreaming(false);
currentClient.setScreenPublishStarted(false);
-
this.clientListManager.updateClientByStreamId(
+
clientListManager.updateClientByStreamId(
currentClient.getStreamid(), currentClient);
-
}
-
- if (stopRecording) {
-
+ if
(Boolean.valueOf(map.get("stopRecording").toString())) {
if (currentClient.isStartStreaming()) {
returnMap.put("result",
"stopRecordingOnly");
}
@@ -264,21 +257,23 @@ public class ScopeApplicationAdapter ext
//Send message to all users
syncMessageToCurrentScope("stopRecordingMessage", currentClient, false);
-
this.flvRecorderService.stopRecordAndSave(
+ flvRecorderService.stopRecordAndSave(
current.getScope(),
currentClient, null);
currentClient.setStartRecording(false);
currentClient.setIsRecording(false);
-
this.clientListManager.updateClientByStreamId(
+
clientListManager.updateClientByStreamId(
currentClient.getStreamid(), currentClient);
-
}
-
+ if
(Boolean.valueOf(map.get("stopPublishing").toString())) {
+ streamPublishingStop();
+ if (currentClient.getIsScreenClient()
&& currentClient.isStartStreaming()) {
+ returnMap.put("result",
"stopPublishingOnly");
+ }
+ }
}
-
return returnMap;
-
} catch (Exception err) {
log.error("[screenSharerAction]", err);
}
@@ -402,27 +397,25 @@ public class ScopeApplicationAdapter ext
.getClient().getId(),
currentClient);
if (startStreaming) {
-
returnMap.put("modus",
"startStreaming");
log.debug("start streamPublishStart Is
Screen Sharing ");
//Send message to all users
syncMessageToCurrentScope("newRed5ScreenSharing", currentClient, false);
-
- }
-
- if (startRecording) {
-
+ } else if (startRecording) {
returnMap.put("modus",
"startRecording");
String recordingName = "Recording "
+ CalendarPatterns
.getDateWithTimeByMiliSeconds(new Date());
-
this.flvRecorderService.recordMeetingStream(recordingName,
- "", false);
-
+
flvRecorderService.recordMeetingStream(recordingName, "", false);
+ } else if
(Boolean.valueOf(map.get("startPublishing").toString())) {
+ returnMap.put("modus",
"startPublishing");
+ streamPublishingStart("" +
map.get("publishingHost")
+ , "" + map.get("publishingApp")
+ , "" + map.get("publishingId"));
}
return returnMap;
@@ -805,6 +798,64 @@ public class ScopeApplicationAdapter ext
}
}
+ public IBroadcastScope getBroadcastScope(IScope scope, String name) {
+ IBasicScope basicScope =
scope.getBasicScope(IBroadcastScope.TYPE, name);
+ if (!(basicScope instanceof IBroadcastScope)) {
+ return null;
+ } else {
+ return (IBroadcastScope) basicScope;
+ }
+ }
+
+ public void streamPublishingStart(String host, String app, String id) {
+ IConnection current = Red5.getConnectionLocal();
+ RoomClient rc =
clientListManager.getClientByStreamId(current.getClient().getId());
+ String publishName = rc.getStreamPublishName();
+
+ if (rc.getIsScreenClient() && rc.isStartStreaming()) {
+ IScope scope = current.getScope();
+ IBroadcastStream stream = getBroadcastStream(scope,
publishName);
+ IBroadcastScope bsScope = getBroadcastScope(scope, publishName);
+ final StreamingProxy proxy = new StreamingProxy();
+ proxy.setHost(host);
+ proxy.setApp(app);
+ proxy.setPort(1935);
+ proxy.init();
+ bsScope.subscribe(proxy, null);
+ proxy.start(id, StreamingProxy.LIVE, null);
+ streamingProxyMap.put(publishName, proxy);
+ stream.addStreamListener(new IStreamListener() {
+ public void packetReceived(IBroadcastStream
stream, IStreamPacket packet) {
+ try {
+ RTMPMessage m =
RTMPMessage.build((IRTMPEvent)packet, packet.getTimestamp());
+ proxy.pushMessage(null, m);
+ } catch (IOException ioe) {
+ log.error("Exception while
sending proxy message", ioe);
+ }
+ }
+ });
+ }
+ }
+
+ public void streamPublishingStop() {
+ IConnection current = Red5.getConnectionLocal();
+ RoomClient rc =
clientListManager.getClientByStreamId(current.getClient().getId());
+ String publishName = rc.getStreamPublishName();
+
+ if (rc.getIsScreenClient() && publishName != null) {
+ IScope scope = current.getScope();
+ IBroadcastStream stream = getBroadcastStream(scope,
publishName);
+ StreamingProxy proxy =
streamingProxyMap.remove(publishName);
+ if (proxy != null) {
+ proxy.stop();
+ IBroadcastScope bsScope =
getBroadcastScope(scope, stream.getPublishedName());
+ if (bsScope != null) {
+ bsScope.unsubscribe(proxy);
+ }
+ }
+ }
+ }
+
/**
* This method handles the Event after a stream has been removed all
* connected Clients in the same room will get a notification
@@ -819,9 +870,10 @@ public class ScopeApplicationAdapter ext
log.debug("start streamBroadcastClose broadcast close: "
+ stream.getPublishedName());
try {
- RoomClient rcl =
this.clientListManager.getClientByStreamId(Red5
-
.getConnectionLocal().getClient().getId());
-
+ streamPublishingStop();
+
+ IConnection current = Red5.getConnectionLocal();
+ RoomClient rcl =
clientListManager.getClientByStreamId(current.getClient().getId());
sendClientBroadcastNotifications(stream, "closeStream",
rcl);
} catch (Exception e) {
log.error("[streamBroadcastClose]", e);
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/CoreScreenShare.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/CoreScreenShare.java?rev=1337762&r1=1337761&r2=1337762&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/CoreScreenShare.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/CoreScreenShare.java
Sun May 13 03:38:42 2012
@@ -69,11 +69,9 @@ public class CoreScreenShare {
public Long user_id = null;
public Boolean allowRecording = true;
- public boolean startRecording = false;
- public boolean stopRecording = false;
-
- public boolean startStreaming = false;
- public boolean stopStreaming = false;
+ private boolean startStreaming = false;
+ private boolean startRecording = false;
+ private boolean startPublishing = false;
public String label730 = "Desktop Publisher";
public String label731 = "This application will publish your screen";
@@ -225,7 +223,7 @@ public class CoreScreenShare {
}
});
frame.setVisible(true);
- frame.setTabsEnabled(allowRecording);
+ frame.setRecordingTabEnabled(allowRecording);
logger.debug("initialized");
@@ -279,8 +277,12 @@ public class CoreScreenShare {
map.put("screenHeight", scaledHeight);
map.put("publishName", this.publishName);
- map.put("startRecording", this.startRecording);
- map.put("startStreaming", this.startStreaming);
+ map.put("startRecording", startRecording);
+ map.put("startStreaming", startStreaming);
+ map.put("startPublishing", startPublishing);
+ map.put("publishingHost", frame.getPublishHost());
+ map.put("publishingApp", frame.getPublishApp());
+ map.put("publishingId", frame.getPublishId());
map.put("organization_id", this.organization_id);
map.put("user_id", this.user_id);
@@ -293,30 +295,53 @@ public class CoreScreenShare {
}
}
- public void captureScreenStart() {
+ /**
+ * @param startStreaming flag denoting the streaming is started
+ * @param startRecording flag denoting the recording is started
+ */
+ public void captureScreenStart(boolean startStreaming, boolean
startRecording) {
+ captureScreenStart(startStreaming, startRecording, false);
+ }
+
+ public void captureScreenStart(boolean startStreaming, boolean
startRecording, boolean startPublishing) {
try {
logger.debug("captureScreenStart");
- startStream(host, app, port, publishName);
+ this.startStreaming = startStreaming;
+ this.startRecording= startRecording;
+ this.startPublishing = startPublishing;
+
+ if (!isConnected) {
+ instance.connect(host, port, app, instance);
+ } else {
+ setConnectionAsSharingClient();
+ }
} catch (Exception err) {
logger.error("captureScreenStart Exception: ", err);
frame.setStatus("Exception: " + err);
}
}
- public void captureScreenStop() {
+ public void captureScreenStop(boolean stopStreaming, boolean
stopRecording) {
+ captureScreenStop(stopStreaming, stopRecording, false);
+ }
+
+ public void captureScreenStop(boolean stopStreaming, boolean
stopRecording, boolean stopPublishing) {
try {
logger.debug("INVOKE screenSharerAction" );
- Map<Object, Object> map = new HashMap<Object, Object>();
- map.put("stopStreaming", this.stopStreaming);
- map.put("stopRecording", this.stopRecording);
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("stopStreaming", stopStreaming);
+ map.put("stopRecording", stopRecording);
+ map.put("stopPublishing", stopPublishing);
instance.invoke("screenSharerAction", new Object[] {
map }, instance);
if (stopStreaming) {
frame.setSharingStatus(false);
- } else {
+ } else if (stopRecording) {
frame.setRecordingStatus(false);
+ } else if (stopPublishing) {
+ frame.setPublishingStatus(false);
}
} catch (Exception err) {
logger.error("captureScreenStop Exception: ", err);
@@ -330,23 +355,6 @@ public class CoreScreenShare {
//
//
------------------------------------------------------------------------
- public void startStream(String host, String app, int port,
- String publishName) {
-
- logger.debug("ScreenShare startStream");
- this.publishName = publishName;
-
- try {
- if (!isConnected) {
- instance.connect(host, port, app, instance);
- } else {
- setConnectionAsSharingClient();
- }
- } catch (Exception e) {
- logger.error("ScreenShare startStream exception " + e);
- }
- }
-
protected void onInvoke(RTMPConnection conn, Channel channel,
Header source, Notify invoke, RTMP rtmp) {
@@ -758,35 +766,21 @@ public class CoreScreenShare {
logger.debug( "service call result: " + call );
if (call.getServiceMethodName().equals("connect")) {
-
isConnected = true;
setConnectionAsSharingClient();
-
} else if (call.getServiceMethodName().equals(
"setConnectionAsSharingClient")) {
- // logger.debug("call get Method Name
"+call.getServiceMethodName());
-
Object o = call.getResult();
- // logger.debug("Result Map Type
"+o.getClass().getName());
-
@SuppressWarnings("rawtypes")
Map returnMap = (Map) o;
- // logger.debug("result
"+returnMap.get("result"));
-
- // for (Iterator iter =
- //
returnMap.keySet().iterator();iter.hasNext();) {
- // logger.debug("key "+iter.next());
- // }
-
if (o == null || !Boolean.valueOf("" +
returnMap.get("alreadyPublished")).booleanValue()) {
logger.debug("Stream not yet started -
do it ");
instance.createStream(instance);
} else {
-
if (this.capture != null) {
this.capture.resetBuffer();
}
@@ -794,13 +788,14 @@ public class CoreScreenShare {
logger.debug("The Stream was already
started ");
}
- if (returnMap != null && returnMap.get("modus")
!= null) {
- if (returnMap.get("modus").toString()
-
.equals("startStreaming")) {
+ if (returnMap != null) {
+ Object modus = returnMap.get("modus");
+ if ("startStreaming".equals(modus)) {
frame.setSharingStatus(true);
- } else if
(returnMap.get("modus").toString()
-
.equals("startRecording")) {
+ } else if
("startRecording".equals(modus)) {
frame.setRecordingStatus(true);
+ } else if
("startPublishing".equals(modus)) {
+ frame.setPublishingStatus(true);
}
} else {
throw new Exception(
@@ -817,10 +812,6 @@ public class CoreScreenShare {
logger.debug("setup capture thread");
- logger.debug("setup capture thread
getCanonicalName "
- +
ScreenDimensions.class.getCanonicalName());
- logger.debug("setup capture thread getName "
- +
ScreenDimensions.class.getName());
logger.debug("setup capture thread
vScreenSpinnerWidth "
+
ScreenDimensions.spinnerWidth);
logger.debug("setup capture thread
vScreenSpinnerHeight "
@@ -835,7 +826,6 @@ public class CoreScreenShare {
capture.start();
} else if
(call.getServiceMethodName().equals("screenSharerAction")) {
-
logger.debug("call ### get Method Name "
+ call.getServiceMethodName());
@@ -843,27 +833,19 @@ public class CoreScreenShare {
logger.debug("Result Map Type " +
o.getClass().getName());
- @SuppressWarnings("rawtypes")
- Map returnMap = (Map) o;
-
- // logger.debug("result
"+returnMap.get("result"));
-
- // for (Iterator iter =
- //
returnMap.keySet().iterator();iter.hasNext();) {
- // logger.debug("key "+iter.next());
- // }
-
- if (returnMap.get("result").equals("stopAll")) {
-
+ @SuppressWarnings("unchecked")
+ Map<String, Object> returnMap = (Map<String,
Object>)o;
+ Object result = returnMap.get("result");
+ if ("stopAll".equals(result)) {
logger.debug("Stopping to stream, there
is neither a Desktop Sharing nor Recording anymore");
-
stopStream();
-
+ } else if ("stopSharingOnly".equals(result)) {
+ //no op
+ } else if ("stopRecordingOnly".equals(result)) {
+ //no op
+ } else if ("stopPublishingOnly".equals(result))
{
+ frame.setPublishingStatus(false);
}
-
- // logger.debug("Stop No Doubt!");
- // stopStream();
-
} else if (call.getServiceMethodName().equals(
"setNewCursorPosition")) {
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/gui/ScreenSharerFrame.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/gui/ScreenSharerFrame.java?rev=1337762&r1=1337761&r2=1337762&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/gui/ScreenSharerFrame.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/screen/webstart/gui/ScreenSharerFrame.java
Sun May 13 03:38:42 2012
@@ -75,6 +75,7 @@ public class ScreenSharerFrame extends J
private JButton btnStartPauseSharing;
private JButton btnStartRecording;
private JButton btnStopRecording;
+ private JButton btnStartPublish;
private JButton btnStopPublish;
private NumberSpinner spinnerX;
private NumberSpinner spinnerY;
@@ -82,7 +83,7 @@ public class ScreenSharerFrame extends J
private NumberSpinner spinnerHeight;
private JComboBox comboQuality;
private JTextField textPublishHost;
- private JTextField textPublishContext;
+ private JTextField textPublishApp;
private JTextField textPublishId;
private JLabel lblPublishURL;
private boolean sharingStarted = false;
@@ -102,15 +103,15 @@ public class ScreenSharerFrame extends J
getDocument().addDocumentListener(
new DocumentListener() {
public void changedUpdate(DocumentEvent
e) {
- updateLabelURL();
+ updatePublishURL();
}
public void removeUpdate(DocumentEvent
e) {
- updateLabelURL();
+ updatePublishURL();
}
public void insertUpdate(DocumentEvent
e) {
- updateLabelURL();
+ updatePublishURL();
}
});
@@ -230,13 +231,9 @@ public class ScreenSharerFrame extends J
btnStartPauseSharing.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (sharingStarted) {
- core.stopRecording = false;
- core.stopStreaming = true;
- core.captureScreenStop();
+ core.captureScreenStop(true, false);
} else {
- core.startRecording = false;
- core.startStreaming = true;
- core.captureScreenStart();
+ core.captureScreenStart(true, false);
}
}
});
@@ -272,9 +269,7 @@ public class ScreenSharerFrame extends J
btnStartRecording.setBounds(10, 82, 200, 32);
btnStartRecording.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
- core.startRecording = true;
- core.startStreaming = false;
- core.captureScreenStart();
+ core.captureScreenStart(false, true);
}
});
panelRecording.add(btnStartRecording);
@@ -285,9 +280,7 @@ public class ScreenSharerFrame extends J
btnStopRecording.setBounds(257, 82, 200, 32);
btnStopRecording.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
- core.stopRecording = true;
- core.stopStreaming = false;
- core.captureScreenStop();
+ core.captureScreenStop(false, true);
}
});
panelRecording.add(btnStopRecording);
@@ -298,16 +291,26 @@ public class ScreenSharerFrame extends J
panelPublish.setEnabled(false);
panelPublish.setLayout(null);
- JButton btnStartPublish = new JButton(core.label1466);
+ btnStartPublish = new JButton(core.label1466);
btnStartPublish.setToolTipText(core.label1466);
//btnStartPublish.setIcon(new
ImageIcon(ScreenSharerFrame.class.getResource("/org/openmeetings/screen/record.png")));
btnStartPublish.setBounds(10, 82, 200, 32);
+ btnStartPublish.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ core.captureScreenStart(false, false, true);
+ }
+ });
panelPublish.add(btnStartPublish);
btnStopPublish = new JButton(core.label1467);
btnStopPublish.setToolTipText(core.label1467);
btnStopPublish.setIcon(stopIcon);
btnStopPublish.setBounds(257, 82, 200, 32);
+ btnStopPublish.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ core.captureScreenStop(false, false, true);
+ }
+ });
panelPublish.add(btnStopPublish);
JLabel lblPublishHost = new JLabel(core.label1468);
@@ -319,14 +322,14 @@ public class ScreenSharerFrame extends J
textPublishHost.setBounds(10, 38, 140, 20);
panelPublish.add(textPublishHost);
- JLabel lblPublishContext = new JLabel(core.label1469);
- lblPublishContext.setVerticalAlignment(SwingConstants.TOP);
- lblPublishContext.setBounds(160, 10, 140, 20);
- panelPublish.add(lblPublishContext);
-
- textPublishContext = new PublishTextField();
- textPublishContext.setBounds(160, 38, 140, 20);
- panelPublish.add(textPublishContext);
+ JLabel lblPublishApp = new JLabel(core.label1469);
+ lblPublishApp.setVerticalAlignment(SwingConstants.TOP);
+ lblPublishApp.setBounds(160, 10, 140, 20);
+ panelPublish.add(lblPublishApp);
+
+ textPublishApp = new PublishTextField();
+ textPublishApp.setBounds(160, 38, 140, 20);
+ panelPublish.add(textPublishApp);
JLabel lblPublishId = new JLabel(core.label1470);
lblPublishId.setVerticalAlignment(SwingConstants.TOP);
@@ -511,20 +514,11 @@ public class ScreenSharerFrame extends J
comboQuality.setSelectedIndex(core.defaultQuality);
panelScreen.add(comboQuality);
+ setPublishingTabEnabled(false);
contentPane.setLayout(gl_contentPane);
- //
// Background Image
-
//We have no logo, that is why we need no background,
sebawagner 29.04.2012
-
-// Image im_left = ImageIO.read(getClass()
-//
.getResource("/org/openmeetings/screen/background.png"));
-// ImageIcon iIconBack = new ImageIcon(im_left);
-//
-// JLabel jLab = new JLabel(iIconBack);
-// jLab.setBounds(0, 0, 500, 440);
-// contentPane.add(jLab);
}
public void setSharingStatus(boolean status) {
@@ -533,6 +527,7 @@ public class ScreenSharerFrame extends J
btnStartPauseSharing.setIcon(status ? pauseIcon : startIcon);
btnStartPauseSharing.setText(status ? pauseLabel : startLabel);
btnStartPauseSharing.setToolTipText(status ? pauseLabel :
startLabel);
+ setPublishingTabEnabled(status);
}
public void setRecordingStatus(boolean status) {
@@ -541,18 +536,39 @@ public class ScreenSharerFrame extends J
btnStopRecording.setEnabled(status);
}
- public void setTabsEnabled(boolean enabled) {
+ public void setPublishingStatus(boolean status) {
+ panelScreen.setEnabled(!status);
+ btnStartPublish.setEnabled(!status);
+ btnStopPublish.setEnabled(status);
+ }
+
+ public void setRecordingTabEnabled(boolean enabled) {
panelRecording.setEnabled(enabled);
btnStopRecording.setEnabled(false);
tabbedPane.setEnabledAt(0, enabled);
+ }
+
+ private void setPublishingTabEnabled(boolean enabled) {
panelPublish.setEnabled(enabled);
btnStopPublish.setEnabled(false);
tabbedPane.setEnabledAt(1, enabled);
}
- private void updateLabelURL() {
+ public String getPublishHost() {
+ return textPublishHost.getText();
+ }
+
+ public String getPublishApp() {
+ return textPublishApp.getText();
+ }
+
+ public String getPublishId() {
+ return textPublishId.getText();
+ }
+
+ private void updatePublishURL() {
lblPublishURL.setText("rtmp://" + textPublishHost.getText() +
":1935/"
- + textPublishContext.getText() + "/" +
textPublishId.getText());
+ + textPublishApp.getText() + "/" +
textPublishId.getText());
}
public void setShowWarning(boolean showWarning) {