protected override async Task OnCommandPlay(CommandMessage msg, CancellationToken cancel_token)
{
if (msg.Arguments[0].Type == AMFValueType.Boolean && ((bool)msg.Arguments[0].Value) == false)
{
await OnCommandPlayStop(msg, cancel_token);
return;
}
var stream_name = StreamName.Parse((string)msg.Arguments[0]);
var start = msg.Arguments.Count > 1 ? (int)msg.Arguments[1] : -2;
var duration = msg.Arguments.Count > 2 ? (int)msg.Arguments[2] : -1;
var reset = msg.Arguments.Count > 3 ? (bool)msg.Arguments[3] : false;
logger.Debug("Play: {0}, {1}, {2}, {3}", stream_name.ToString(), start, duration, reset);
if (owner.CheckAuthotization(stream_name.GetParameter("auth")))
{
this.Channel = await RequestChannel(stream_name, cancel_token).ConfigureAwait(false);
this.StreamId = msg.StreamId;
await SendMessage(2, new UserControlMessage.StreamBeginMessage(this.Now, 0, msg.StreamId), cancel_token).ConfigureAwait(false);
if (this.Channel != null)
{
if (reset)
{
await SendOnStatus(
this.StreamId,
msg.TransactionId + 1,
"status",
"NetStream.Play.Reset",
stream_name.ToString(),
cancel_token).ConfigureAwait(false);
}
await SendOnStatus(
this.StreamId,
msg.TransactionId + 1,
"status",
"NetStream.Play.Start",
stream_name.ToString(),
cancel_token).ConfigureAwait(false);
}
else
{
await SendOnStatus(
this.StreamId,
msg.TransactionId + 1,
"error",
"NetStream.Play.StreamNotFound",
stream_name.ToString(),
cancel_token).ConfigureAwait(false);
}
}
else
{
await SendOnStatus(
this.StreamId,
msg.TransactionId + 1,
"error",
"NetStream.Play.Failed",
"auth failed",
cancel_token).ConfigureAwait(false);
}
if (msg.TransactionId != 0)
{
var result = CommandMessage.Create(
this.ObjectEncoding,
this.Now,
msg.StreamId,
"_result",
msg.TransactionId,
null
);
await SendMessage(3, result, cancel_token).ConfigureAwait(false);
}
if (this.Channel != null)
{
await base.OnCommandPlay(msg, cancel_token).ConfigureAwait(false);
channelSubscription = this.Channel.AddContentSink(this);
}
else
{
Close();
}
}