|
|
@ -3,7 +3,6 @@ using Newtonsoft.Json.Linq; |
|
|
|
using System; |
|
|
|
using System.Collections; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.IO; |
|
|
|
using System.Text; |
|
|
|
using System.Threading; |
|
|
|
using WebSocketSharp; |
|
|
@ -31,65 +30,6 @@ namespace Example1 |
|
|
|
configure (); |
|
|
|
} |
|
|
|
|
|
|
|
private AudioMessage acceptBinaryMessage (byte [] data) |
|
|
|
{ |
|
|
|
var id = data.SubArray (0, 4).To<uint> (ByteOrder.Big); |
|
|
|
var chNum = data.SubArray (4, 1) [0]; |
|
|
|
var bufferLength = data.SubArray (5, 4).To<uint> (ByteOrder.Big); |
|
|
|
var bufferArray = new float [chNum, bufferLength]; |
|
|
|
|
|
|
|
var offset = 9; |
|
|
|
((int) chNum).Times ( |
|
|
|
i => bufferLength.Times ( |
|
|
|
j => { |
|
|
|
bufferArray [i, j] = data.SubArray (offset, 4).To<float> (ByteOrder.Big); |
|
|
|
offset += 4; |
|
|
|
})); |
|
|
|
|
|
|
|
return new AudioMessage { |
|
|
|
user_id = id, |
|
|
|
ch_num = chNum, |
|
|
|
buffer_length = bufferLength, |
|
|
|
buffer_array = bufferArray |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
private NotificationMessage acceptTextMessage (string data) |
|
|
|
{ |
|
|
|
var json = JObject.Parse (data); |
|
|
|
var id = (uint) json ["user_id"]; |
|
|
|
var name = (string) json ["name"]; |
|
|
|
var type = (string) json ["type"]; |
|
|
|
|
|
|
|
string message; |
|
|
|
if (type == "message") |
|
|
|
message = String.Format ("{0}: {1}", name, (string) json ["message"]); |
|
|
|
else if (type == "start_music") |
|
|
|
message = String.Format ("{0}: Started playing music!", name); |
|
|
|
else if (type == "connection") { |
|
|
|
var users = (JArray) json ["message"]; |
|
|
|
var msg = new StringBuilder ("Now keeping connections:"); |
|
|
|
foreach (JToken user in users) |
|
|
|
msg.AppendFormat ( |
|
|
|
"\n- user_id: {0} name: {1}", (uint) user ["user_id"], (string) user ["name"]); |
|
|
|
|
|
|
|
message = msg.ToString (); |
|
|
|
} |
|
|
|
else if (type == "connected") { |
|
|
|
_id = id; |
|
|
|
_heartbeatTimer.Change (30000, 30000); |
|
|
|
message = String.Format ("user_id: {0} name: {1}", id, name); |
|
|
|
} |
|
|
|
else |
|
|
|
message = "Received unknown type message."; |
|
|
|
|
|
|
|
return new NotificationMessage { |
|
|
|
Summary = String.Format ("AudioStreamer ({0})", type), |
|
|
|
Body = message, |
|
|
|
Icon = "notification-message-im" |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
private void configure () |
|
|
|
{ |
|
|
|
#if DEBUG
|
|
|
@ -99,15 +39,16 @@ namespace Example1 |
|
|
|
_websocket.Send (createTextMessage ("connection", String.Empty)); |
|
|
|
|
|
|
|
_websocket.OnMessage += (sender, e) => { |
|
|
|
if (e.Type == Opcode.Text) |
|
|
|
_notifier.Notify (acceptTextMessage (e.Data)); |
|
|
|
if (e.Type == Opcode.Text) { |
|
|
|
_notifier.Notify (convertTextMessage (e.Data)); |
|
|
|
} |
|
|
|
else { |
|
|
|
var msg = acceptBinaryMessage (e.RawData); |
|
|
|
var msg = convertBinaryMessage (e.RawData); |
|
|
|
if (msg.user_id == _id) |
|
|
|
return; |
|
|
|
|
|
|
|
if (_audioBox.ContainsKey (msg.user_id)) { |
|
|
|
_audioBox [msg.user_id].Enqueue (msg.buffer_array); |
|
|
|
_audioBox[msg.user_id].Enqueue (msg.buffer_array); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
@ -134,21 +75,83 @@ namespace Example1 |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private byte [] createAudioMessage (float [,] bufferArray) |
|
|
|
private AudioMessage convertBinaryMessage (byte[] data) |
|
|
|
{ |
|
|
|
var id = data.SubArray (0, 4).To<uint> (ByteOrder.Big); |
|
|
|
var chNum = data.SubArray (4, 1)[0]; |
|
|
|
var buffLen = data.SubArray (5, 4).To<uint> (ByteOrder.Big); |
|
|
|
var buffArr = new float[chNum, buffLen]; |
|
|
|
|
|
|
|
var offset = 9; |
|
|
|
((int) chNum).Times ( |
|
|
|
i => buffLen.Times ( |
|
|
|
j => { |
|
|
|
buffArr[i, j] = data.SubArray (offset, 4).To<float> (ByteOrder.Big); |
|
|
|
offset += 4; |
|
|
|
})); |
|
|
|
|
|
|
|
return new AudioMessage { |
|
|
|
user_id = id, |
|
|
|
ch_num = chNum, |
|
|
|
buffer_length = buffLen, |
|
|
|
buffer_array = buffArr |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
private NotificationMessage convertTextMessage (string data) |
|
|
|
{ |
|
|
|
var json = JObject.Parse (data); |
|
|
|
var id = (uint) json["user_id"]; |
|
|
|
var name = (string) json["name"]; |
|
|
|
var type = (string) json["type"]; |
|
|
|
|
|
|
|
string body; |
|
|
|
if (type == "message") { |
|
|
|
body = String.Format ("{0}: {1}", name, (string) json["message"]); |
|
|
|
} |
|
|
|
else if (type == "start_music") { |
|
|
|
body = String.Format ("{0}: Started playing music!", name); |
|
|
|
} |
|
|
|
else if (type == "connection") { |
|
|
|
var users = (JArray) json["message"]; |
|
|
|
var buff = new StringBuilder ("Now keeping connections:"); |
|
|
|
foreach (JToken user in users) |
|
|
|
buff.AppendFormat ( |
|
|
|
"\n- user_id: {0} name: {1}", (uint) user["user_id"], (string) user["name"]); |
|
|
|
|
|
|
|
body = buff.ToString (); |
|
|
|
} |
|
|
|
else if (type == "connected") { |
|
|
|
_id = id; |
|
|
|
_heartbeatTimer.Change (30000, 30000); |
|
|
|
body = String.Format ("user_id: {0} name: {1}", id, name); |
|
|
|
} |
|
|
|
else { |
|
|
|
body = "Received unknown type message."; |
|
|
|
} |
|
|
|
|
|
|
|
return new NotificationMessage { |
|
|
|
Summary = String.Format ("AudioStreamer ({0})", type), |
|
|
|
Body = body, |
|
|
|
Icon = "notification-message-im" |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
private byte[] createBinaryMessage (float[,] bufferArray) |
|
|
|
{ |
|
|
|
var msg = new List<byte> (); |
|
|
|
|
|
|
|
var id = (uint) _id; |
|
|
|
var chNum = bufferArray.GetLength (0); |
|
|
|
var bufferLength = bufferArray.GetLength (1); |
|
|
|
var buffLen = bufferArray.GetLength (1); |
|
|
|
|
|
|
|
msg.AddRange (id.ToByteArray (ByteOrder.Big)); |
|
|
|
msg.Add ((byte) chNum); |
|
|
|
msg.AddRange (((uint) bufferLength).ToByteArray (ByteOrder.Big)); |
|
|
|
msg.AddRange (((uint) buffLen).ToByteArray (ByteOrder.Big)); |
|
|
|
|
|
|
|
chNum.Times ( |
|
|
|
i => bufferLength.Times ( |
|
|
|
j => msg.AddRange (bufferArray [i, j].ToByteArray (ByteOrder.Big)))); |
|
|
|
i => buffLen.Times ( |
|
|
|
j => msg.AddRange (bufferArray[i, j].ToByteArray (ByteOrder.Big)))); |
|
|
|
|
|
|
|
return msg.ToArray (); |
|
|
|
} |
|
|
|