You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by se...@apache.org on 2012/04/14 14:01:21 UTC

svn commit: r1326089 - in /incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app: conference/session/ data/flvrecord/converter/ data/flvrecord/listener/ data/flvrecord/listener/async/ persistence/beans/adresses/ persistence/beans/flvrecord...

Author: sebawagner
Date: Sat Apr 14 12:01:18 2012
New Revision: 1326089

URL: http://svn.apache.org/viewvc?rev=1326089&view=rev
Log:
OPENMEETINGS-165 Records the video asynchronous with queuing for the audio stream

Added:
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/CachedEvent.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java
Removed:
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamTranscodingListener.java
Modified:
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/conference/session/RoomClient.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/ListenerAdapter.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/adresses/States.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaData.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaDelta.java
    incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/conference/session/RoomClient.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/conference/session/RoomClient.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/conference/session/RoomClient.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/conference/session/RoomClient.java Sat Apr 14 12:01:18 2012
@@ -200,12 +200,6 @@ public class RoomClient implements Seria
 		this.lastname = lastname;
 	}
 	
-	/**
-     * 
-     * @hibernate.id
-     *  column="roomclient_id"
-     *  generator-class="increment"
-     */
 	public Long getRoomClientId() {
 		return roomClientId;
 	}
@@ -213,11 +207,6 @@ public class RoomClient implements Seria
 		this.roomClientId = roomClientId;
 	}
 
-	/**
-     * @hibernate.property
-     *  column="connected_since"
-     *  type="java.util.Date"
-     */
 	public Date getConnectedSince() {
 		return connectedSince;
 	}
@@ -225,11 +214,6 @@ public class RoomClient implements Seria
 		this.connectedSince = connectedSince;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="is_mod"
-     *  type="boolean"
-     */
 	public Boolean getIsMod() {
 		return isMod;
 	}

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/converter/BaseConverter.java Sat Apr 14 12:01:18 2012
@@ -155,6 +155,31 @@ public abstract class BaseConverter {
 			log.debug("###################################################");
 	
 			for (FlvRecordingMetaData flvRecordingMetaData : metaDataList) {
+				
+				if (flvRecordingMetaData.getStreamReaderThreadComplete() == null) {
+					throw new Exception("StreamReaderThreadComplete Bit is NULL, error in recording");
+				}
+				
+				if (flvRecordingMetaData.getStreamReaderThreadComplete()) {
+					
+					log.debug("### meta Stream not yet written to disk" + flvRecordingMetaData.getFlvRecordingMetaDataId());
+					boolean doStop = true;
+					while(doStop) {
+						
+						log.debug("### Stream not yet written Thread Sleep - " );
+						
+						Thread.sleep(100L);
+						
+						flvRecordingMetaData = flvRecordingMetaDataDaoImpl.getFlvRecordingMetaDataById(flvRecordingMetaData.getFlvRecordingMetaDataId());
+						
+						if (flvRecordingMetaData.getStreamReaderThreadComplete()) {
+							log.debug("### Stream now written Thread continue - " );
+							doStop = false;
+						}
+						
+					}
+					
+				}
 	
 				String inputFlv = streamFolderName
 						+ flvRecordingMetaData.getStreamName() + ".flv";
@@ -199,11 +224,11 @@ public abstract class BaseConverter {
 				}
 	
 				if (flvRecordingMetaData.getAudioIsValid()) {
-	
+					
 					// Strip Wave to Full Length
 					String outputGapFullWav = outputWav;
 	
-					// Fix Gaps in Audio
+					// Fix Start/End in Audio
 					List<FlvRecordingMetaDelta> flvRecordingMetaDeltas = flvRecordingMetaDeltaDaoImpl
 							.getFlvRecordingMetaDeltaByMetaId(flvRecordingMetaData
 									.getFlvRecordingMetaDataId());

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/ListenerAdapter.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/ListenerAdapter.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/ListenerAdapter.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/ListenerAdapter.java Sat Apr 14 12:01:18 2012
@@ -36,7 +36,7 @@ import org.red5.server.api.stream.IBroad
 import org.red5.server.api.stream.IStreamListener;
 import org.red5.server.api.stream.IStreamPacket;
 
-public class ListenerAdapter implements IStreamListener {
+public abstract class ListenerAdapter implements IStreamListener {
 	
 	protected ITagWriter writer = null;
 	
@@ -76,14 +76,7 @@ public class ListenerAdapter implements 
 		return flvRecordingMetaDataId;
 	}	
 	
-	public void packetReceived(IBroadcastStream arg0, IStreamPacket arg1) {
-		// Auto-generated method stub
-		
-	}
-
-	public void closeStream() throws Exception {
-		// Auto-generated method stub
-	}
+	public abstract void closeStream();
 	
 	/**
      * Initialization

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamAudioListener.java Sat Apr 14 12:01:18 2012
@@ -18,17 +18,13 @@
  */
 package org.openmeetings.app.data.flvrecord.listener;
 
-import java.io.File;
-import java.io.IOException;
 import java.util.Date;
 
-import org.apache.mina.core.buffer.IoBuffer;
 import org.openmeetings.app.OpenmeetingsVariables;
+import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
 import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDeltaDaoImpl;
-import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaDelta;
-import org.openmeetings.app.remote.red5.ScopeApplicationAdapter;
-import org.red5.io.ITag;
-import org.red5.io.flv.impl.Tag;
+import org.openmeetings.app.data.flvrecord.listener.async.CachedEvent;
+import org.openmeetings.app.data.flvrecord.listener.async.StreamAudioWriter;
 import org.red5.logging.Red5LoggerFactory;
 import org.red5.server.api.IScope;
 import org.red5.server.api.stream.IBroadcastStream;
@@ -37,384 +33,44 @@ import org.slf4j.Logger;
 
 public class StreamAudioListener extends ListenerAdapter {
 
-	private int startTimeStamp = -1;
-
-	private long initialDelta = 0;
-
-	private Integer lastTimeStamp = -1;
-
-	private int lastStreamPacketTimeStamp = -1;
-
-	private long byteCount = 0;
-
-	private int duration = 0;
-
 	private static final Logger log = Red5LoggerFactory.getLogger(
 			StreamAudioListener.class, OpenmeetingsVariables.webAppRootKey);
 
-	// Autowire is not possible
-	private final FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao;
+	private final StreamAudioWriter streamAudioWriter;
 
 	public StreamAudioListener(String streamName, IScope scope,
 			Long flvRecordingMetaDataId, boolean isScreenData,
 			boolean isInterview,
-			FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao) {
+			FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao,
+			FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
 		// Auto-generated method stub
 		super(streamName, scope, flvRecordingMetaDataId, isScreenData,
 				isInterview);
-		this.flvRecordingMetaDeltaDao = flvRecordingMetaDeltaDao;
+		streamAudioWriter = new StreamAudioWriter(streamName, scope,
+				flvRecordingMetaDataId, isScreenData, isInterview,
+				flvRecordingMetaDeltaDao, flvRecordingMetaDataDao);
 	}
 
-	public void streamResetEvent() {
-
-		try {
-
-			FlvRecordingMetaDelta flvRecordingMetaDelta = new FlvRecordingMetaDelta();
-
-			flvRecordingMetaDelta.setDeltaTime(0L);
-			flvRecordingMetaDelta
-					.setFlvRecordingMetaDataId(this.flvRecordingMetaDataId);
-			flvRecordingMetaDelta.setTimeStamp(0);
-			flvRecordingMetaDelta.setDebugStatus("RESET TYPE :: ");
-			flvRecordingMetaDelta.setIsStartPadding(true);
-			flvRecordingMetaDelta.setIsEndPadding(false);
-			flvRecordingMetaDelta.setDataLengthPacket(0);
-			flvRecordingMetaDelta.setReceivedAudioDataLength(this.byteCount);
-			flvRecordingMetaDelta.setStartTime(this.startedSessionTimeDate);
-			flvRecordingMetaDelta.setStreamCreationTime(null);
-			flvRecordingMetaDelta.setStreamCreationTimeDate(null);
-			flvRecordingMetaDelta.setPacketTimeStamp(lastTimeStamp);
-
-			Date current_date = new Date();
-			Long deltaTimeStamp = current_date.getTime()
-					- this.startedSessionTimeDate.getTime();
-
-			// this.duration = Math.max(this.duration, 0 +
-			// this.writer.getOffset());
-			flvRecordingMetaDelta.setDuration(0);
-
-			Long missingTime = deltaTimeStamp - 0;
-
-			flvRecordingMetaDelta.setMissingTime(missingTime);
-
-			flvRecordingMetaDelta.setCurrentTime(current_date);
-			flvRecordingMetaDelta.setDeltaTimeStamp(deltaTimeStamp);
-			flvRecordingMetaDelta.setStartTimeStamp(startTimeStamp);
-
-			this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
-
-			flvRecordingMetaDeltaDao
-					.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
-
-			this.offset += lastTimeStamp;
-
-		} catch (Exception e) {
-			log.error("[packetReceived]", e);
-		}
-
-	}
-
-	@Override
 	public void packetReceived(IBroadcastStream broadcastStream,
 			IStreamPacket streampacket) {
 		try {
 
-			// //Here we handle Reseted timestamps!
-			// if (startTimeStamp != -1) {
-			//
-			// long deltaTimeBetweenTimeStampes = purePacketLastTimeStamp -
-			// streampacket.getTimestamp();
-			//
-			// System.out.println("deltaTimeBetweenTimeStampes "+deltaTimeBetweenTimeStampes);
-			//
-			// if (deltaTimeBetweenTimeStampes < -100) {
-			//
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("We have detected a Reset in the TimeStamps!");
-			//
-			// System.out.println("streampacket.getTimestamp() :: "+streampacket.getTimestamp());
-			// System.out.println("purePacketLastTimeStamp :: "+purePacketLastTimeStamp);
-			// System.out.println("startTimeStamp :: "+startTimeStamp);
-			//
-			// int debugTimeStamp = purePacketLastTimeStamp - startTimeStamp;
-			//
-			// System.out.println("debugTimeStamp :: "+debugTimeStamp);
-			// System.out.println("offset :: "+offset);
-			//
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			// log.debug("############################################");
-			//
-			// this.offset += debugTimeStamp;
-			//
-			// }
-			// purePacketLastTimeStamp = streampacket.getTimestamp();
-			// }
-
-			// log.debug("streampacket.getTimestamp() :: "+streampacket.getTimestamp());
-
-			// We only care about audio at this moment
-			if (streampacket.getDataType() == 8) {
-
-				if (this.isClosed) {
-					// Already closed this One
-					return;
-				}
-
-				if (streampacket.getTimestamp() <= 0) {
-					log.warn("Negative TimeStamp");
-					return;
-				}
-
-				IoBuffer data = streampacket.getData().asReadOnlyBuffer();
-
-				if (data.limit() == 0) {
-					return;
-				}
-
-				this.byteCount += data.limit();
-
-				if (startTimeStamp == -1) {
-
-					// Calculate the delta between the initial start and the
-					// first audio-packet data
-
-					this.initialDelta = new Date().getTime()
-							- this.startedSessionTimeDate.getTime();
-
-					FlvRecordingMetaDelta flvRecordingMetaDelta = new FlvRecordingMetaDelta();
-
-					flvRecordingMetaDelta.setDeltaTime(this.initialDelta);
-					flvRecordingMetaDelta
-							.setFlvRecordingMetaDataId(this.flvRecordingMetaDataId);
-					flvRecordingMetaDelta.setTimeStamp(0);
-					flvRecordingMetaDelta.setDebugStatus("INIT AUDIO");
-					flvRecordingMetaDelta.setOffset(this.offset);
-					flvRecordingMetaDelta.setIsStartPadding(true);
-					flvRecordingMetaDelta.setIsEndPadding(false);
-					flvRecordingMetaDelta.setDataLengthPacket(data.limit());
-					flvRecordingMetaDelta
-							.setReceivedAudioDataLength(this.byteCount);
-					flvRecordingMetaDelta
-							.setStartTime(this.startedSessionTimeDate);
-					flvRecordingMetaDelta.setStreamCreationTime(broadcastStream
-							.getCreationTime());
-					flvRecordingMetaDelta.setStreamCreationTimeDate(new Date(
-							broadcastStream.getCreationTime()));
-					flvRecordingMetaDelta.setPacketTimeStamp(streampacket
-							.getTimestamp());
-
-					Date current_date = new Date();
-					Long deltaTimeStamp = current_date.getTime()
-							- this.startedSessionTimeDate.getTime();
-
-					// this.duration = Math.max(this.duration, 0 +
-					// this.writer.getOffset());
-					flvRecordingMetaDelta.setDuration(0);
-
-					Long missingTime = deltaTimeStamp - 0;
-
-					flvRecordingMetaDelta.setMissingTime(missingTime);
-
-					flvRecordingMetaDelta.setCurrentTime(current_date);
-					flvRecordingMetaDelta.setDeltaTimeStamp(deltaTimeStamp);
-					flvRecordingMetaDelta.setStartTimeStamp(startTimeStamp);
-
-					this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
-
-					flvRecordingMetaDeltaDao
-							.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
-
-					// That will be not bigger then long value
-					this.startTimeStamp = (streampacket.getTimestamp());
-
-					// We have to set that to bypass the initial delta
-					// lastTimeStamp = startTimeStamp;
-				}
-
-				if (writer == null) {
-
-					File folder = new File(ScopeApplicationAdapter.webAppPath
-							+ File.separatorChar + "streams"
-							+ File.separatorChar + this.scope.getName());
-
-					if (!folder.exists()) {
-						folder.mkdir();
-					}
-
-					String flvName = ScopeApplicationAdapter.webAppPath
-							+ File.separatorChar + "streams"
-							+ File.separatorChar + this.scope.getName()
-							+ File.separatorChar + this.streamName + ".flv";
-
-					file = new File(flvName);
-					init();
-				}
-
-				int timeStamp = streampacket.getTimestamp();
-
-				this.lastStreamPacketTimeStamp = streampacket.getTimestamp();
-
-				timeStamp -= this.startTimeStamp;
-
-				timeStamp += this.offset;
-
-				long deltaTime = 0;
-				if (lastTimeStamp == -1) {
-					deltaTime = 0; // Offset at the beginning is calculated
-									// above
-				} else {
-					deltaTime = timeStamp - lastTimeStamp;
-				}
-
-				Long preLastTimeStamp = Long
-						.parseLong(lastTimeStamp.toString());
-
-				lastTimeStamp = timeStamp;
-
-				if (deltaTime > 75) {
-
-					FlvRecordingMetaDelta flvRecordingMetaDelta = new FlvRecordingMetaDelta();
-
-					flvRecordingMetaDelta.setDeltaTime(deltaTime);
-					flvRecordingMetaDelta
-							.setFlvRecordingMetaDataId(this.flvRecordingMetaDataId);
-					flvRecordingMetaDelta.setTimeStamp(timeStamp);
-					flvRecordingMetaDelta.setDebugStatus("RUN AUDIO");
-					flvRecordingMetaDelta.setIsStartPadding(false);
-					flvRecordingMetaDelta.setLastTimeStamp(preLastTimeStamp);
-					flvRecordingMetaDelta.setOffset(this.offset);
-					flvRecordingMetaDelta.setIsEndPadding(false);
-					flvRecordingMetaDelta.setDataLengthPacket(data.limit());
-					flvRecordingMetaDelta
-							.setReceivedAudioDataLength(this.byteCount);
-					flvRecordingMetaDelta
-							.setStartTime(this.startedSessionTimeDate);
-					flvRecordingMetaDelta.setStreamCreationTime(broadcastStream
-							.getCreationTime());
-					flvRecordingMetaDelta.setStreamCreationTimeDate(new Date(
-							broadcastStream.getCreationTime()));
-					flvRecordingMetaDelta.setPacketTimeStamp(streampacket
-							.getTimestamp());
-
-					Date current_date = new Date();
-					Long deltaTimeStamp = current_date.getTime()
-							- this.startedSessionTimeDate.getTime();
-
-					this.duration = Math.max(this.duration, timeStamp
-							+ this.writer.getOffset());
-					flvRecordingMetaDelta.setDuration(this.duration);
-
-					Long missingTime = deltaTimeStamp - timeStamp;
-
-					flvRecordingMetaDelta.setMissingTime(missingTime);
-
-					flvRecordingMetaDelta.setCurrentTime(current_date);
-					flvRecordingMetaDelta.setDeltaTimeStamp(deltaTimeStamp);
-					flvRecordingMetaDelta.setStartTimeStamp(startTimeStamp);
-
-					this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
-
-					flvRecordingMetaDeltaDao
-							.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
-
-				}
-
-				ITag tag = new Tag();
-				tag.setDataType(streampacket.getDataType());
-
-				// log.debug("data.limit() :: "+data.limit());
-				tag.setBodySize(data.limit());
-				tag.setTimestamp(timeStamp);
-				tag.setBody(data);
-				
-				if (this.isClosed) {
-					throw new Exception("Stream was already closed");
-				}
-				
-				writer.writeTag(tag);
+			CachedEvent cachedEvent = new CachedEvent();
+			cachedEvent.setData(streampacket.getData().duplicate());
+			cachedEvent.setDataType(streampacket.getDataType());
+			cachedEvent.setTimestamp(streampacket.getTimestamp());
+			cachedEvent.setCurrentTime(new Date());
 
-			}
+			streamAudioWriter.append(cachedEvent);
 
-		} catch (IOException e) {
-			log.error("[packetReceived]", e);
 		} catch (Exception e) {
 			log.error("[packetReceived]", e);
 		}
 	}
 
 	@Override
-	public void closeStream() throws Exception {
-		if (writer != null && !this.isClosed) {
-			try {
-
-				log.debug("#################### -start- closeStream ########################");
-				log.debug("#################### -start- closeStream ########################");
-
-				writer.close();
-
-				this.isClosed = true;
-
-				// We do not add any End Padding or count the gaps for the
-				// Screen Data,
-				// cause there is no!
-
-				long deltaRecordingTime = new Date().getTime()
-						- this.startedSessionTimeDate.getTime();
-
-				log.debug("lastTimeStamp :: " + this.lastTimeStamp);
-				log.debug("lastStreamPacketTimeStamp :: "
-						+ this.lastStreamPacketTimeStamp);
-				log.debug("deltaRecordingTime :: " + deltaRecordingTime);
-
-				long deltaTimePaddingEnd = deltaRecordingTime
-						- this.lastTimeStamp - this.initialDelta;
-
-				log.debug("deltaTimePaddingEnd :: " + deltaTimePaddingEnd);
-
-				FlvRecordingMetaDelta flvRecordingMetaDelta = new FlvRecordingMetaDelta();
-
-				flvRecordingMetaDelta.setDeltaTime(deltaTimePaddingEnd);
-				flvRecordingMetaDelta
-						.setFlvRecordingMetaDataId(this.flvRecordingMetaDataId);
-				flvRecordingMetaDelta.setTimeStamp(this.lastTimeStamp);
-				flvRecordingMetaDelta.setDebugStatus("END AUDIO");
-				flvRecordingMetaDelta.setIsStartPadding(false);
-				flvRecordingMetaDelta.setIsEndPadding(true);
-				flvRecordingMetaDelta.setDataLengthPacket(null);
-				flvRecordingMetaDelta
-						.setReceivedAudioDataLength(this.byteCount);
-				flvRecordingMetaDelta.setStartTime(this.startedSessionTimeDate);
-				flvRecordingMetaDelta.setCurrentTime(new Date());
-
-				this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
-
-				flvRecordingMetaDeltaDao
-						.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
-
-				// for (FlvRecordingMetaDelta flvRecordingMetaDeltaLoop :
-				// this.flvRecordingMetaDeltas) {
-				//
-				// flvRecordingMetaDeltaDao.addFlvRecordingMetaDelta(flvRecordingMetaDeltaLoop);
-				//
-				// }
-
-			} catch (Exception err) {
-				log.error("[closeStream]", err);
-			}
-			log.debug("#################### -end- closeStream ########################");
-			log.debug("#################### -end- closeStream ########################");
-		}
+	public void closeStream() {
+		streamAudioWriter.stop();
 	}
 
 }

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/StreamScreenListener.java Sat Apr 14 12:01:18 2012
@@ -59,7 +59,6 @@ public class StreamScreenListener extend
 		this.flvRecordingMetaDataDao = flvRecordingMetaDataDao;
 	}
 
-	@Override
 	public void packetReceived(IBroadcastStream broadcastStream,
 			IStreamPacket streampacket) {
 		try {
@@ -163,7 +162,7 @@ public class StreamScreenListener extend
 	}
 
 	@Override
-	public void closeStream() throws Exception {
+	public void closeStream() {
 		if (writer != null && !this.isClosed) {
 			try {
 

Added: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java?rev=1326089&view=auto
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java (added)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/BaseStreamWriter.java Sat Apr 14 12:01:18 2012
@@ -0,0 +1,189 @@
+package org.openmeetings.app.data.flvrecord.listener.async;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.openmeetings.app.OpenmeetingsVariables;
+import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
+import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDeltaDaoImpl;
+import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaDelta;
+import org.openmeetings.app.remote.red5.ScopeApplicationAdapter;
+import org.red5.io.IStreamableFile;
+import org.red5.io.IStreamableFileFactory;
+import org.red5.io.IStreamableFileService;
+import org.red5.io.ITagWriter;
+import org.red5.io.StreamableFileFactory;
+import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.IScope;
+import org.red5.server.api.ScopeUtils;
+import org.slf4j.Logger;
+
+public abstract class BaseStreamWriter implements Runnable {
+
+	private static final Logger log = Red5LoggerFactory.getLogger(
+			BaseStreamWriter.class, OpenmeetingsVariables.webAppRootKey);
+
+	// thread is running
+	private boolean running = false;
+	// thread is stopped
+	private boolean stopping = false;
+	// thread will be stopped as soon as the queue is empty
+	private boolean dostopping = false;
+
+	protected ITagWriter writer = null;
+
+	protected Long flvRecordingMetaDataId = null;
+	protected List<FlvRecordingMetaDelta> flvRecordingMetaDeltas;
+
+	protected Date startedSessionTimeDate = null;
+
+	protected File file;
+
+	protected IScope scope;
+
+	protected boolean isScreenData = false;
+
+	protected String streamName = "";
+
+	protected boolean isInterview;
+
+	private final BlockingQueue<CachedEvent> queue = new LinkedBlockingQueue<CachedEvent>();
+
+	// Autowire is not possible
+	protected final FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao;
+	protected final FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao;
+
+	public BaseStreamWriter(String streamName, IScope scope,
+			Long flvRecordingMetaDataId, boolean isScreenData,
+			boolean isInterview,
+			FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao,
+			FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
+		this.startedSessionTimeDate = new Date();
+		this.isScreenData = isScreenData;
+		this.streamName = streamName;
+		this.flvRecordingMetaDataId = flvRecordingMetaDataId;
+		this.flvRecordingMetaDeltas = new LinkedList<FlvRecordingMetaDelta>();
+		this.scope = scope;
+		this.isInterview = isInterview;
+		this.flvRecordingMetaDeltaDao = flvRecordingMetaDeltaDao;
+		this.flvRecordingMetaDataDao = flvRecordingMetaDataDao;
+		try {
+			init();
+		} catch (IOException ex) {
+			log.error("[StreamAudioWriter] Could not start Thread", ex);
+		}
+		open();
+	}
+
+	/**
+	 * Initialization
+	 * 
+	 * @throws IOException
+	 *             I/O exception
+	 */
+	private void init() throws IOException {
+
+		File folder = new File(ScopeApplicationAdapter.webAppPath
+				+ File.separatorChar + "streams" + File.separatorChar
+				+ this.scope.getName());
+
+		if (!folder.exists()) {
+			folder.mkdir();
+		}
+
+		String flvName = ScopeApplicationAdapter.webAppPath
+				+ File.separatorChar + "streams" + File.separatorChar
+				+ this.scope.getName() + File.separatorChar + this.streamName
+				+ ".flv";
+
+		file = new File(flvName);
+
+		IStreamableFileFactory factory = (IStreamableFileFactory) ScopeUtils
+				.getScopeService(this.scope, IStreamableFileFactory.class,
+						StreamableFileFactory.class);
+
+		// File folder = file.getParentFile();
+
+		if (!folder.exists()) {
+			if (!folder.mkdirs()) {
+				throw new IOException("Could not create parent folder");
+			}
+		}
+
+		if (!this.file.isFile()) {
+
+			// Maybe the (previously existing) file has been deleted
+			this.file.createNewFile();
+
+		} else if (!file.canWrite()) {
+			throw new IOException("The file is read-only");
+		}
+
+		IStreamableFileService service = factory.getService(this.file);
+		IStreamableFile flv = service.getStreamableFile(this.file);
+		this.writer = flv.getWriter();
+
+	}
+
+	private void open() {
+		running = true;
+		new Thread(this).start();
+	}
+
+	public void stop() {
+		dostopping = true;
+	}
+
+	public void run() {
+		while (!stopping) {
+			try {
+				CachedEvent item = queue.poll(100, TimeUnit.MICROSECONDS);
+				if (item != null) {
+
+					if (dostopping) {
+						log.debug("Recording stopped but still packets to write to file!");
+					}
+
+					packetReceived(item);
+				} else if (dostopping) {
+					stopping = true;
+					closeStream();
+				}
+			} catch (InterruptedException e) {
+				log.error("[run]", e);
+			}
+		}
+	}
+
+	/**
+	 * Write the actual packet data to the disk and do calculate any needed
+	 * additional information
+	 * 
+	 * @param streampacket
+	 */
+	public abstract void packetReceived(CachedEvent streampacket);
+
+	/**
+	 * called when the stream is finished written on the disk
+	 */
+	public abstract void closeStream();
+
+	public void append(CachedEvent streampacket) {
+		if (!running) {
+			throw new IllegalStateException(
+					"Append called before the Thread was started!");
+		}
+		try {
+			queue.put(streampacket);
+		} catch (InterruptedException ignored) {
+			log.error("[append]", ignored);
+		}
+	}
+
+}

Added: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/CachedEvent.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/CachedEvent.java?rev=1326089&view=auto
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/CachedEvent.java (added)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/CachedEvent.java Sat Apr 14 12:01:18 2012
@@ -0,0 +1,49 @@
+package org.openmeetings.app.data.flvrecord.listener.async;
+
+import java.util.Date;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.red5.server.api.stream.IStreamPacket;
+
+public class CachedEvent implements IStreamPacket {
+
+	private byte dataType;
+	private int timestamp; //this is the timeStamp, showing the time elapsed since the microphone was turned on
+	private IoBuffer data;
+	private Date currentTime; //this is the actually current timeStamp when the packet with audio data did enter the server
+
+	public Date getCurrentTime() {
+		return currentTime;
+	}
+
+	public void setCurrentTime(Date currentTime) {
+		this.currentTime = currentTime;
+	}
+
+	public void setDataType(byte dataType) {
+		this.dataType = dataType;
+	}
+
+	public void setTimestamp(int timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public void setData(IoBuffer data) {
+		this.data = data;
+	}
+
+	public byte getDataType() {
+		return dataType;
+	}
+
+	public int getTimestamp() {
+		// TODO Auto-generated method stub
+		return timestamp;
+	}
+
+	public IoBuffer getData() {
+		// TODO Auto-generated method stub
+		return data;
+	}
+
+}

Added: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java?rev=1326089&view=auto
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java (added)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/data/flvrecord/listener/async/StreamAudioWriter.java Sat Apr 14 12:01:18 2012
@@ -0,0 +1,259 @@
+package org.openmeetings.app.data.flvrecord.listener.async;
+
+import java.io.IOException;
+import java.util.Date;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.openmeetings.app.OpenmeetingsVariables;
+import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
+import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDeltaDaoImpl;
+import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaData;
+import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaDelta;
+import org.red5.io.ITag;
+import org.red5.io.flv.impl.Tag;
+import org.red5.logging.Red5LoggerFactory;
+import org.red5.server.api.IScope;
+import org.slf4j.Logger;
+
+public class StreamAudioWriter extends BaseStreamWriter {
+
+	private static final Logger log = Red5LoggerFactory.getLogger(
+			StreamAudioWriter.class, OpenmeetingsVariables.webAppRootKey);
+
+	private int duration = 0;
+
+	private int startTimeStamp = -1;
+
+	private long initialDelta = 0;
+
+	private Integer lastTimeStamp = -1;
+	private Date lastcurrentTime = null;
+
+	private int lastStreamPacketTimeStamp = -1;
+
+	private long byteCount = 0;
+	
+	public StreamAudioWriter(String streamName, IScope scope,
+			Long flvRecordingMetaDataId, boolean isScreenData,
+			boolean isInterview,
+			FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao,
+			FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao) {
+		super(streamName, scope, flvRecordingMetaDataId, isScreenData, isInterview,
+				flvRecordingMetaDeltaDao, flvRecordingMetaDataDao);
+		
+		FlvRecordingMetaData flvRecordingMetaData = flvRecordingMetaDataDao.
+								getFlvRecordingMetaDataById(flvRecordingMetaDataId);
+		flvRecordingMetaData.setStreamReaderThreadComplete(false);
+		flvRecordingMetaDataDao.updateFlvRecordingMetaData(flvRecordingMetaData);
+		
+	}
+
+	@Override
+	public void packetReceived(CachedEvent streampacket) {
+		try {
+
+			// We only care about audio at this moment
+			if (streampacket.getDataType() == 8) {
+
+				if (streampacket.getTimestamp() <= 0) {
+					log.warn("Negative TimeStamp");
+					return;
+				}
+
+				IoBuffer data = streampacket.getData().asReadOnlyBuffer();
+
+				if (data.limit() == 0) {
+					return;
+				}
+
+				this.byteCount += data.limit();
+				
+				lastcurrentTime = streampacket.getCurrentTime();
+				int timeStamp = streampacket.getTimestamp();
+				Date virtualTime = streampacket.getCurrentTime();
+
+				if (startTimeStamp == -1) {
+
+					// Calculate the delta between the initial start and the
+					// first audio-packet data
+
+					this.initialDelta = virtualTime.getTime()
+							- this.startedSessionTimeDate.getTime();
+
+					FlvRecordingMetaDelta flvRecordingMetaDelta = new FlvRecordingMetaDelta();
+
+					flvRecordingMetaDelta.setDeltaTime(this.initialDelta);
+					flvRecordingMetaDelta
+							.setFlvRecordingMetaDataId(this.flvRecordingMetaDataId);
+					flvRecordingMetaDelta.setTimeStamp(0);
+					flvRecordingMetaDelta.setDebugStatus("INIT AUDIO");
+					flvRecordingMetaDelta.setIsStartPadding(true);
+					flvRecordingMetaDelta.setIsEndPadding(false);
+					flvRecordingMetaDelta.setDataLengthPacket(data.limit());
+					flvRecordingMetaDelta
+							.setReceivedAudioDataLength(this.byteCount);
+					flvRecordingMetaDelta
+							.setStartTime(this.startedSessionTimeDate);
+					flvRecordingMetaDelta.setPacketTimeStamp(streampacket
+							.getTimestamp());
+
+					Long deltaTimeStamp = virtualTime.getTime()
+							- this.startedSessionTimeDate.getTime();
+
+					// this.duration = Math.max(this.duration, 0 +
+					// this.writer.getOffset());
+					flvRecordingMetaDelta.setDuration(0);
+
+					Long missingTime = deltaTimeStamp - 0;
+
+					flvRecordingMetaDelta.setMissingTime(missingTime);
+
+					flvRecordingMetaDelta.setCurrentTime(virtualTime);
+					flvRecordingMetaDelta.setDeltaTimeStamp(deltaTimeStamp);
+					flvRecordingMetaDelta.setStartTimeStamp(startTimeStamp);
+
+					this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
+
+					flvRecordingMetaDeltaDao
+							.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
+
+					// That will be not bigger then long value
+					this.startTimeStamp = (streampacket.getTimestamp());
+
+					// We have to set that to bypass the initial delta
+					// lastTimeStamp = startTimeStamp;
+				}
+
+				
+
+				this.lastStreamPacketTimeStamp = streampacket.getTimestamp();
+
+				timeStamp -= this.startTimeStamp;
+
+				long deltaTime = 0;
+				if (lastTimeStamp == -1) {
+					deltaTime = 0; // Offset at the beginning is calculated
+									// above
+				} else {
+					deltaTime = timeStamp - lastTimeStamp;
+				}
+
+				Long preLastTimeStamp = Long
+						.parseLong(lastTimeStamp.toString());
+
+				lastTimeStamp = timeStamp;
+
+				if (deltaTime > 75) {
+
+					FlvRecordingMetaDelta flvRecordingMetaDelta = new FlvRecordingMetaDelta();
+
+					flvRecordingMetaDelta.setDeltaTime(deltaTime);
+					flvRecordingMetaDelta
+							.setFlvRecordingMetaDataId(this.flvRecordingMetaDataId);
+					flvRecordingMetaDelta.setTimeStamp(timeStamp);
+					flvRecordingMetaDelta.setDebugStatus("RUN AUDIO");
+					flvRecordingMetaDelta.setIsStartPadding(false);
+					flvRecordingMetaDelta.setLastTimeStamp(preLastTimeStamp);
+					flvRecordingMetaDelta.setIsEndPadding(false);
+					flvRecordingMetaDelta.setDataLengthPacket(data.limit());
+					flvRecordingMetaDelta
+							.setReceivedAudioDataLength(this.byteCount);
+					flvRecordingMetaDelta
+							.setStartTime(this.startedSessionTimeDate);
+					flvRecordingMetaDelta.setPacketTimeStamp(streampacket
+							.getTimestamp());
+
+					Date current_date = new Date();
+					Long deltaTimeStamp = current_date.getTime()
+							- this.startedSessionTimeDate.getTime();
+
+					this.duration = Math.max(this.duration, timeStamp
+							+ this.writer.getOffset());
+					flvRecordingMetaDelta.setDuration(this.duration);
+
+					Long missingTime = deltaTimeStamp - timeStamp;
+
+					flvRecordingMetaDelta.setMissingTime(missingTime);
+
+					flvRecordingMetaDelta.setCurrentTime(current_date);
+					flvRecordingMetaDelta.setDeltaTimeStamp(deltaTimeStamp);
+					flvRecordingMetaDelta.setStartTimeStamp(startTimeStamp);
+
+					this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
+
+					flvRecordingMetaDeltaDao
+							.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
+
+				}
+
+				ITag tag = new Tag();
+				tag.setDataType(streampacket.getDataType());
+
+				// log.debug("data.limit() :: "+data.limit());
+				tag.setBodySize(data.limit());
+				tag.setTimestamp(timeStamp);
+				tag.setBody(data);
+
+				writer.writeTag(tag);
+
+			}
+
+		} catch (IOException e) {
+			log.error("[packetReceived]", e);
+		} catch (Exception e) {
+			log.error("[packetReceived]", e);
+		}
+	}
+
+	@Override
+	public void closeStream() {
+		try {
+
+			writer.close();
+
+			// We do not add any End Padding or count the gaps for the
+			// Screen Data, cause there is no!
+			
+			Date virtualTime = lastcurrentTime;
+
+			long deltaRecordingTime = virtualTime.getTime() - this.startedSessionTimeDate.getTime();
+
+			log.debug("lastTimeStamp :closeStream: " + this.lastTimeStamp);
+			log.debug("lastStreamPacketTimeStamp :closeStream: " + this.lastStreamPacketTimeStamp);
+			log.debug("deltaRecordingTime :closeStream: " + deltaRecordingTime);
+
+			long deltaTimePaddingEnd = deltaRecordingTime
+					- this.lastTimeStamp - this.initialDelta;
+
+			log.debug("deltaTimePaddingEnd :: " + deltaTimePaddingEnd);
+
+			FlvRecordingMetaDelta flvRecordingMetaDelta = new FlvRecordingMetaDelta();
+
+			flvRecordingMetaDelta.setDeltaTime(deltaTimePaddingEnd);
+			flvRecordingMetaDelta
+					.setFlvRecordingMetaDataId(this.flvRecordingMetaDataId);
+			flvRecordingMetaDelta.setTimeStamp(this.lastTimeStamp);
+			flvRecordingMetaDelta.setDebugStatus("END AUDIO");
+			flvRecordingMetaDelta.setIsStartPadding(false);
+			flvRecordingMetaDelta.setIsEndPadding(true);
+			flvRecordingMetaDelta.setDataLengthPacket(null);
+			flvRecordingMetaDelta
+					.setReceivedAudioDataLength(this.byteCount);
+			flvRecordingMetaDelta.setStartTime(this.startedSessionTimeDate);
+			flvRecordingMetaDelta.setCurrentTime(new Date());
+
+			this.flvRecordingMetaDeltas.add(flvRecordingMetaDelta);
+
+			flvRecordingMetaDeltaDao
+					.addFlvRecordingMetaDelta(flvRecordingMetaDelta);
+			
+			//Write the complete Bit to the meta data, the converter task will wait for this bit!
+			FlvRecordingMetaData flvRecordingMetaData = flvRecordingMetaDataDao.getFlvRecordingMetaDataById(flvRecordingMetaDataId);
+			flvRecordingMetaData.setStreamReaderThreadComplete(true);
+			flvRecordingMetaDataDao.updateFlvRecordingMetaData(flvRecordingMetaData);
+
+		} catch (Exception err) {
+			log.error("[closeStream]", err);
+		}
+	}
+}

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/adresses/States.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/adresses/States.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/adresses/States.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/adresses/States.java Sat Apr 14 12:01:18 2012
@@ -53,11 +53,6 @@ public class States implements Serializa
 		// TODO Auto-generated constructor stub
 	}
 
-    /**
-     * @hibernate.property
-     *  column="name"
-     *  type="string"
-     */ 
 	public String getName() {
 		return name;
 	}

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaData.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaData.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaData.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaData.java Sat Apr 14 12:01:18 2012
@@ -21,8 +21,6 @@ package org.openmeetings.app.persistence
 import java.io.Serializable;
 import java.util.Date;
 
-
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
@@ -39,6 +37,12 @@ import javax.persistence.Table;
 @Table(name = "flvrecording_metadata")
 public class FlvRecordingMetaData implements Serializable {
 	
+	public Boolean getStreamReaderThreadComplete() {
+		return streamReaderThreadComplete;
+	}
+	public void setStreamReaderThreadComplete(Boolean streamReaderThreadComplete) {
+		this.streamReaderThreadComplete = streamReaderThreadComplete;
+	}
 	/**
 	 * 
 	 */
@@ -90,12 +94,11 @@ public class FlvRecordingMetaData implem
 	@Column(name="initial_gap_seconds")
 	private Integer initialGapSeconds;
 	
-	/**
-	 *
-	 * @hibernate.id
-	 *  column="flvrecording_metadata_id"
-	 *  generator-class="increment"
-	 */
+	//this is only true when the asynchronous stream writer has 
+	//completed to write packets to the file
+	@Column(name="stream_reader_thread_complete")
+	private Boolean streamReaderThreadComplete;
+	
 	public long getFlvRecordingMetaDataId() {
 		return flvRecordingMetaDataId;
 	}
@@ -103,15 +106,6 @@ public class FlvRecordingMetaData implem
 		this.flvRecordingMetaDataId = flvRecordingMetaDataId;
 	}
 	
-	/**
-     * @hibernate.many-to-one
-     *  cascade="none"
-     *  column="flvrecording_id"
-     *  lazy="false"
-     *  class="org.openmeetings.app.hibernate.beans.flvrecord.FlvRecording"
-     *  not-null="false"
-     *  outer-join="true"
-     */ 
 	public FlvRecording getFlvRecording() {
 		return flvRecording;
 	}
@@ -119,12 +113,6 @@ public class FlvRecordingMetaData implem
 		this.flvRecording = flvRecording;
 	}
 
-	/**
-     * @hibernate.property
-     *  column="record_start"
-     *  update="false"
-     *  type="java.util.Date"
-     */
 	public Date getRecordStart() {
 		return recordStart;
 	}
@@ -132,11 +120,6 @@ public class FlvRecordingMetaData implem
 		this.recordStart = recordStart;
 	}
 
-	/**
-     * @hibernate.property
-     *  column="record_end"
-     *  type="java.util.Date"
-     */
 	public Date getRecordEnd() {
 		return recordEnd;
 	}
@@ -144,11 +127,6 @@ public class FlvRecordingMetaData implem
 		this.recordEnd = recordEnd;
 	}
 
-	/**
-     * @hibernate.property
-     *  column="free_text_user_name"
-     *  type="string"
-     */
 	public String getFreeTextUserName() {
 		return freeTextUserName;
 	}
@@ -156,11 +134,6 @@ public class FlvRecordingMetaData implem
 		this.freeTextUserName = freeTextUserName;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="is_audio_only"
-     *  type="boolean"
-     */
 	public Boolean getIsAudioOnly() {
 		return isAudioOnly;
 	}
@@ -168,11 +141,6 @@ public class FlvRecordingMetaData implem
 		this.isAudioOnly = isAudioOnly;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="is_video_only"
-     *  type="boolean"
-     */	
 	public Boolean getIsVideoOnly() {
 		return isVideoOnly;
 	}
@@ -180,11 +148,6 @@ public class FlvRecordingMetaData implem
 		this.isVideoOnly = isVideoOnly;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="inserted_by"
-     *  type="long"
-     */
 	public Long getInsertedBy() {
 		return insertedBy;
 	}
@@ -192,11 +155,6 @@ public class FlvRecordingMetaData implem
 		this.insertedBy = insertedBy;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="inserted"
-     *  type="java.util.Date"
-     */ 
 	public Date getInserted() {
 		return inserted;
 	}
@@ -204,11 +162,6 @@ public class FlvRecordingMetaData implem
 		this.inserted = inserted;
 	}
 
-    /**
-     * @hibernate.property
-     *  column="deleted"
-     *  type="string"
-     */  
 	public String getDeleted() {
 		return deleted;
 	}
@@ -216,11 +169,6 @@ public class FlvRecordingMetaData implem
 		this.deleted = deleted;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="updated"
-     *  type="java.util.Date"
-     */ 
 	public Date getUpdated() {
 		return updated;
 	}
@@ -228,11 +176,6 @@ public class FlvRecordingMetaData implem
 		this.updated = updated;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="is_screen_data"
-     *  type="boolean"
-     */
 	public Boolean getIsScreenData() {
 		return isScreenData;
 	}
@@ -240,11 +183,6 @@ public class FlvRecordingMetaData implem
 		this.isScreenData = isScreenData;
 	}
 
-	/**
-     * @hibernate.property
-     *  column="stream_name"
-     *  type="string"
-     */
 	public String getStreamName() {
 		return streamName;
 	}
@@ -252,11 +190,6 @@ public class FlvRecordingMetaData implem
 		this.streamName = streamName;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="wav_audio_data"
-     *  type="string"
-     */
 	public String getWavAudioData() {
 		return wavAudioData;
 	}
@@ -264,11 +197,6 @@ public class FlvRecordingMetaData implem
 		this.wavAudioData = wavAudioData;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="full_wav_audio_data"
-     *  type="string"
-     */
 	public String getFullWavAudioData() {
 		return fullWavAudioData;
 	}
@@ -276,11 +204,6 @@ public class FlvRecordingMetaData implem
 		this.fullWavAudioData = fullWavAudioData;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="audio_is_valid"
-     *  type="boolean"
-     */
 	public Boolean getAudioIsValid() {
 		return audioIsValid;
 	}
@@ -288,11 +211,6 @@ public class FlvRecordingMetaData implem
 		this.audioIsValid = audioIsValid;
 	}
 
-	/**
-     * @hibernate.property
-     *  column="interiew_pod_id"
-     *  type="int"
-     */
 	public Integer getInteriewPodId() {
 		return interiewPodId;
 	}
@@ -300,15 +218,11 @@ public class FlvRecordingMetaData implem
 		this.interiewPodId = interiewPodId;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="initial_gap_seconds"
-     *  type="int"
-     */
 	public Integer getInitialGapSeconds() {
 		return initialGapSeconds;
 	}
 	public void setInitialGapSeconds(Integer initialGapSeconds) {
 		this.initialGapSeconds = initialGapSeconds;
 	}
+	
 }

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaDelta.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaDelta.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaDelta.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/persistence/beans/flvrecord/FlvRecordingMetaDelta.java Sat Apr 14 12:01:18 2012
@@ -57,8 +57,6 @@ public class FlvRecordingMetaDelta imple
 	private Date currentTime;
 	@Column(name="delta_time_stamp")
 	private Long deltaTimeStamp;
-	@Column(name="offset_time")
-	private Long offset;
 	@Column(name="missing_time")
 	private Long missingTime;
 	@Column(name="duration")
@@ -79,17 +77,7 @@ public class FlvRecordingMetaDelta imple
 	private Boolean isStartPadding;
 	@Column(name="debug_status")
 	private String debugStatus;
-	@Column(name="stream_creation_time")
-	private Long streamCreationTime;
-	@Column(name="stream_creation_time_date")
-	private Date streamCreationTimeDate;
-	
-	/**
-	 *
-	 * @hibernate.id
-	 *  column="flvrecording_meta_delta_id"
-	 *  generator-class="increment"
-	 */
+	
 	public long getFlvRecordingMetaDeltaId() {
 		return flvRecordingMetaDeltaId;
 	}
@@ -97,11 +85,6 @@ public class FlvRecordingMetaDelta imple
 		this.flvRecordingMetaDeltaId = flvRecordingMetaDeltaId;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="flvrecording_metadata_id"
-     *  type="long"
-     */	
 	public Long getFlvRecordingMetaDataId() {
 		return flvRecordingMetaDataId;
 	}
@@ -109,11 +92,6 @@ public class FlvRecordingMetaDelta imple
 		this.flvRecordingMetaDataId = flvRecordingMetaDataId;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="time_stamp"
-     *  type="int"
-     */	
 	public Integer getTimeStamp() {
 		return timeStamp;
 	}
@@ -121,11 +99,6 @@ public class FlvRecordingMetaDelta imple
 		this.timeStamp = timeStamp;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="delta_time"
-     *  type="long"
-     */		
 	public Long getDeltaTime() {
 		return deltaTime;
 	}
@@ -133,11 +106,6 @@ public class FlvRecordingMetaDelta imple
 		this.deltaTime = deltaTime;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="last_time_stamp"
-     *  type="long"
-     */	
 	public Long getLastTimeStamp() {
 		return lastTimeStamp;
 	}
@@ -145,11 +113,6 @@ public class FlvRecordingMetaDelta imple
 		this.lastTimeStamp = lastTimeStamp;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="delta_time_stamp"
-     *  type="long"
-     */		
 	public Long getDeltaTimeStamp() {
 		return deltaTimeStamp;
 	}
@@ -157,11 +120,6 @@ public class FlvRecordingMetaDelta imple
 		this.deltaTimeStamp = deltaTimeStamp;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="packet_time_stamp"
-     *  type="int"
-     */
 	public Integer getPacketTimeStamp() {
 		return packetTimeStamp;
 	}
@@ -169,22 +127,6 @@ public class FlvRecordingMetaDelta imple
 		this.packetTimeStamp = packetTimeStamp;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="offset_time"
-     *  type="long"
-     */
-	public Long getOffset() {
-		return offset;
-	}
-	public void setOffset(Long offset) {
-		this.offset = offset;
-	}
-	/**
-     * @hibernate.property
-     *  column="start_time_stamp"
-     *  type="int"
-     */		
 	public Integer getStartTimeStamp() {
 		return startTimeStamp;
 	}
@@ -192,11 +134,6 @@ public class FlvRecordingMetaDelta imple
 		this.startTimeStamp = startTimeStamp;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="missing_time"
-     *  type="long"
-     */	
 	public Long getMissingTime() {
 		return missingTime;
 	}
@@ -204,11 +141,6 @@ public class FlvRecordingMetaDelta imple
 		this.missingTime = missingTime;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="duration"
-     *  type="int"
-     */		
 	public Integer getDuration() {
 		return duration;
 	}
@@ -216,11 +148,6 @@ public class FlvRecordingMetaDelta imple
 		this.duration = duration;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="start_time"
-     *  type="java.util.Date"
-     */
 	public Date getStartTime() {
 		return startTime;
 	}
@@ -228,11 +155,6 @@ public class FlvRecordingMetaDelta imple
 		this.startTime = startTime;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="current_event_time"
-     *  type="java.util.Date"
-     */	
 	public Date getCurrentTime() {
 		return currentTime;
 	}
@@ -240,11 +162,6 @@ public class FlvRecordingMetaDelta imple
 		this.currentTime = currentTime;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="is_end_padding"
-     *  type="boolean"
-     */
 	public Boolean getIsEndPadding() {
 		return isEndPadding;
 	}
@@ -252,11 +169,6 @@ public class FlvRecordingMetaDelta imple
 		this.isEndPadding = isEndPadding;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="is_start_padding"
-     *  type="boolean"
-     */	
 	public Boolean getIsStartPadding() {
 		return isStartPadding;
 	}
@@ -264,11 +176,6 @@ public class FlvRecordingMetaDelta imple
 		this.isStartPadding = isStartPadding;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="debug_status"
-     *  type="string"
-     */		
 	public String getDebugStatus() {
 		return debugStatus;
 	}
@@ -276,35 +183,6 @@ public class FlvRecordingMetaDelta imple
 		this.debugStatus = debugStatus;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="stream_creation_time"
-     *  type="long"
-     */	
-	public Long getStreamCreationTime() {
-		return streamCreationTime;
-	}
-	public void setStreamCreationTime(Long streamCreationTime) {
-		this.streamCreationTime = streamCreationTime;
-	}
-	
-	/**
-     * @hibernate.property
-     *  column="stream_creation_time_date"
-     *  type="java.util.Date"
-     */		
-	public Date getStreamCreationTimeDate() {
-		return streamCreationTimeDate;
-	}
-	public void setStreamCreationTimeDate(Date streamCreationTimeDate) {
-		this.streamCreationTimeDate = streamCreationTimeDate;
-	}
-	
-	/**
-     * @hibernate.property
-     *  column="wave_out_put_name"
-     *  type="string"
-     */	
 	public String getWaveOutPutName() {
 		return waveOutPutName;
 	}
@@ -312,11 +190,6 @@ public class FlvRecordingMetaDelta imple
 		this.waveOutPutName = waveOutPutName;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="data_length_packet"
-     *  type="int"
-     */		
 	public Integer getDataLengthPacket() {
 		return dataLengthPacket;
 	}
@@ -324,11 +197,6 @@ public class FlvRecordingMetaDelta imple
 		this.dataLengthPacket = dataLengthPacket;
 	}
 	
-	/**
-     * @hibernate.property
-     *  column="received_audio_data_length"
-     *  type="long"
-     */		
 	public Long getReceivedAudioDataLength() {
 		return receivedAudioDataLength;
 	}

Modified: incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java
URL: http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java?rev=1326089&r1=1326088&r2=1326089&view=diff
==============================================================================
--- incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java (original)
+++ incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/remote/FLVRecorderService.java Sat Apr 14 12:01:18 2012
@@ -72,7 +72,7 @@ public class FLVRecorderService implemen
 	@Autowired
 	private FlvRecordingDaoImpl flvRecordingDaoImpl;
 	@Autowired
-	private FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDaoImpl;
+	private FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao;
 	@Autowired
 	private UsersDaoImpl usersDaoImpl;
 	@Autowired
@@ -95,8 +95,6 @@ public class FLVRecorderService implemen
 	private AuthLevelmanagement authLevelManagement;
 	@Autowired
 	private FlvRecordingMetaDeltaDaoImpl flvRecordingMetaDeltaDao;
-	@Autowired
-	private final FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao = null;
 
 	public void resultReceived(IPendingServiceCall arg0) {
 	}
@@ -203,7 +201,7 @@ public class FLVRecorderService implemen
 													.getStreamPublishName()
 													.toString());
 
-									Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl
+									Long flvRecordingMetaDataId = this.flvRecordingMetaDataDao
 											.addFlvRecordingMetaData(
 													flvRecordingId,
 													rcl.getFirstname() + " "
@@ -253,7 +251,7 @@ public class FLVRecorderService implemen
 									isVideoOnly = true;
 								}
 
-								Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl
+								Long flvRecordingMetaDataId = this.flvRecordingMetaDataDao
 										.addFlvRecordingMetaData(
 												flvRecordingId,
 												rcl.getFirstname() + " "
@@ -338,7 +336,7 @@ public class FLVRecorderService implemen
 
 				stream.addStreamListener(new StreamAudioListener(streamName,
 						conn.getScope(), flvRecordingMetaDataId, isScreenData,
-						isInterview, flvRecordingMetaDeltaDao));
+						isInterview, flvRecordingMetaDeltaDao, flvRecordingMetaDataDao));
 			}
 			// Just for Debug Purpose
 			// stream.saveAs(streamName+"_DEBUG", false);
@@ -478,7 +476,7 @@ public class FLVRecorderService implemen
 											rcl.getFlvRecordingMetaDataId());
 
 									// Update Meta Data
-									this.flvRecordingMetaDataDaoImpl
+									this.flvRecordingMetaDataDao
 											.updateFlvRecordingMetaDataEndDate(
 													rcl.getFlvRecordingMetaDataId(),
 													new Date());
@@ -495,7 +493,7 @@ public class FLVRecorderService implemen
 										rcl.getFlvRecordingMetaDataId());
 
 								// Update Meta Data
-								this.flvRecordingMetaDataDaoImpl
+								this.flvRecordingMetaDataDao
 										.updateFlvRecordingMetaDataEndDate(
 												rcl.getFlvRecordingMetaDataId(),
 												new Date());
@@ -612,7 +610,7 @@ public class FLVRecorderService implemen
 							rcl.getFlvRecordingMetaDataId());
 
 					// Update Meta Data
-					this.flvRecordingMetaDataDaoImpl
+					this.flvRecordingMetaDataDao
 							.updateFlvRecordingMetaDataEndDate(
 									rcl.getFlvRecordingMetaDataId(), new Date());
 				}
@@ -628,7 +626,7 @@ public class FLVRecorderService implemen
 						.toString(), rcl.getFlvRecordingMetaDataId());
 
 				// Update Meta Data
-				this.flvRecordingMetaDataDaoImpl
+				this.flvRecordingMetaDataDao
 						.updateFlvRecordingMetaDataEndDate(
 								rcl.getFlvRecordingMetaDataId(), new Date());
 			}
@@ -659,7 +657,7 @@ public class FLVRecorderService implemen
 					log.debug("##############  ADD SCREEN OF SHARER :: "
 							+ rcl.getStreamPublishName());
 
-					Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl
+					Long flvRecordingMetaDataId = this.flvRecordingMetaDataDao
 							.addFlvRecordingMetaData(
 									flvRecordingId,
 									rcl.getFirstname() + " "
@@ -701,7 +699,7 @@ public class FLVRecorderService implemen
 					isVideoOnly = true;
 				}
 
-				Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl
+				Long flvRecordingMetaDataId = this.flvRecordingMetaDataDao
 						.addFlvRecordingMetaData(flvRecordingId,
 								rcl.getFirstname() + " " + rcl.getLastname(),
 								now, isAudioOnly, isVideoOnly, false,
@@ -735,7 +733,7 @@ public class FLVRecorderService implemen
 						.getFlvRecordingById(flvRecordingId);
 
 				flvRecording
-						.setFlvRecordingMetaData(this.flvRecordingMetaDataDaoImpl
+						.setFlvRecordingMetaData(this.flvRecordingMetaDataDao
 								.getFlvRecordingMetaDataByRecording(flvRecordingId));
 
 				if (flvRecording.getInsertedBy() != null) {