package com.laifeng.sopcastsdk.stream.sender.rtmp.io; import com.laifeng.sopcastsdk.entity.Frame; import com.laifeng.sopcastsdk.stream.sender.rtmp.packets.Command; import com.laifeng.sopcastsdk.stream.sender.rtmp.packets.Chunk; import com.laifeng.sopcastsdk.stream.sender.sendqueue.ISendQueue; import java.io.IOException; import java.io.OutputStream; /** * RTMPConnection's write thread * * @author francois, leo */ public class WriteThread extends Thread { private static final String TAG = "WriteThread"; private OutputStream out; private SessionInfo sessionInfo; private OnWriteListener listener; private ISendQueue mSendQueue; private volatile boolean startFlag; public WriteThread(OutputStream out, SessionInfo sessionInfo) { this.out = out; this.sessionInfo = sessionInfo; this.startFlag = true; } public void setWriteListener(OnWriteListener listener) { this.listener = listener; } @Override public void run() { while (startFlag) { try { Frame<Chunk> frame = mSendQueue.takeFrame(); if(frame != null) { Chunk chunk = frame.data; chunk.writeTo(out, sessionInfo); if (chunk instanceof Command) { Command command = (Command) chunk; sessionInfo.addInvokedCommand(command.getTransactionId(), command.getCommandName()); } out.flush(); } } catch (IOException e) { startFlag = false; if(listener != null) { listener.onDisconnect(); } } } } public void setSendQueue(ISendQueue sendQueue) { mSendQueue = sendQueue; } public void shutdown() { listener = null; startFlag = false; this.interrupt(); } }