|
|
|
@@ -618,11 +618,9 @@ namespace Jack |
|
|
|
|
|
|
|
//init loop : get a master and start, do it until connection is ok |
|
|
|
net_status_t status; |
|
|
|
do |
|
|
|
{ |
|
|
|
do { |
|
|
|
//first, get a master, do it until a valid connection is running |
|
|
|
do |
|
|
|
{ |
|
|
|
do { |
|
|
|
status = SendAvailableToMaster(); |
|
|
|
if (status == NET_SOCKET_ERROR) |
|
|
|
return false; |
|
|
|
@@ -652,8 +650,7 @@ namespace Jack |
|
|
|
SetPacketType(&fParams, SLAVE_AVAILABLE); |
|
|
|
|
|
|
|
net_status_t status; |
|
|
|
do |
|
|
|
{ |
|
|
|
do { |
|
|
|
//get a master |
|
|
|
status = SendAvailableToMaster(try_count); |
|
|
|
if (status == NET_SOCKET_ERROR) |
|
|
|
@@ -669,8 +666,7 @@ namespace Jack |
|
|
|
jack_log("JackNetSlaveInterface::InitRendering()"); |
|
|
|
|
|
|
|
net_status_t status; |
|
|
|
do |
|
|
|
{ |
|
|
|
do { |
|
|
|
//then tell the master we are ready |
|
|
|
jack_info("Initializing connection with %s...", fParams.fMasterNetName); |
|
|
|
status = SendStartToMaster(); |
|
|
|
@@ -711,8 +707,7 @@ namespace Jack |
|
|
|
|
|
|
|
//send 'AVAILABLE' until 'SLAVE_SETUP' received |
|
|
|
jack_info("Waiting for a master..."); |
|
|
|
do |
|
|
|
{ |
|
|
|
do { |
|
|
|
//send 'available' |
|
|
|
session_params_t net_params; |
|
|
|
memset(&net_params, 0, sizeof(session_params_t)); |
|
|
|
@@ -724,8 +719,7 @@ namespace Jack |
|
|
|
memset(&net_params, 0, sizeof(session_params_t)); |
|
|
|
rx_bytes = fSocket.CatchHost(&net_params, sizeof(session_params_t), 0); |
|
|
|
SessionParamsNToH(&net_params, &host_params); |
|
|
|
if ((rx_bytes == SOCKET_ERROR) && (fSocket.GetError() != NET_NO_DATA)) |
|
|
|
{ |
|
|
|
if ((rx_bytes == SOCKET_ERROR) && (fSocket.GetError() != NET_NO_DATA)) { |
|
|
|
jack_error("Can't receive : %s", StrError(NET_ERROR_CODE)); |
|
|
|
return NET_RECV_ERROR; |
|
|
|
} |
|
|
|
@@ -758,8 +752,7 @@ namespace Jack |
|
|
|
memset(&net_params, 0, sizeof(session_params_t)); |
|
|
|
SetPacketType(&fParams, START_MASTER); |
|
|
|
SessionParamsHToN(&fParams, &net_params); |
|
|
|
if (fSocket.Send(&net_params, sizeof(session_params_t), 0) == SOCKET_ERROR) |
|
|
|
{ |
|
|
|
if (fSocket.Send(&net_params, sizeof(session_params_t), 0) == SOCKET_ERROR) { |
|
|
|
jack_error("Error in send : %s", StrError(NET_ERROR_CODE)); |
|
|
|
return (fSocket.GetError() == NET_CONN_ERROR) ? NET_ERROR : NET_SEND_ERROR; |
|
|
|
} |
|
|
|
@@ -852,8 +845,7 @@ namespace Jack |
|
|
|
{ |
|
|
|
int rx_bytes = fSocket.Recv(fRxBuffer, size, flags); |
|
|
|
//handle errors |
|
|
|
if (rx_bytes == SOCKET_ERROR) |
|
|
|
{ |
|
|
|
if (rx_bytes == SOCKET_ERROR) { |
|
|
|
net_error_t error = fSocket.GetError(); |
|
|
|
//no data isn't really an error in realtime processing, so just return 0 |
|
|
|
if (error == NET_NO_DATA) { |
|
|
|
@@ -879,8 +871,7 @@ namespace Jack |
|
|
|
int tx_bytes = fSocket.Send(fTxBuffer, size, flags); |
|
|
|
|
|
|
|
//handle errors |
|
|
|
if (tx_bytes == SOCKET_ERROR) |
|
|
|
{ |
|
|
|
if (tx_bytes == SOCKET_ERROR) { |
|
|
|
net_error_t error = fSocket.GetError(); |
|
|
|
//if a network error occurs, this exception will restart the driver |
|
|
|
if (error == NET_CONN_ERROR) { |
|
|
|
@@ -899,8 +890,7 @@ namespace Jack |
|
|
|
packet_header_t* rx_head = reinterpret_cast<packet_header_t*>(fRxBuffer); |
|
|
|
|
|
|
|
//receive sync (launch the cycle) |
|
|
|
do |
|
|
|
{ |
|
|
|
do { |
|
|
|
rx_bytes = Recv(fParams.fMtu, 0); |
|
|
|
//connection issue, send will detect it, so don't skip the cycle (return 0) |
|
|
|
if (rx_bytes == SOCKET_ERROR) |
|
|
|
@@ -918,8 +908,7 @@ namespace Jack |
|
|
|
uint recvd_midi_pckt = 0; |
|
|
|
packet_header_t* rx_head = reinterpret_cast<packet_header_t*>(fRxBuffer); |
|
|
|
|
|
|
|
while (!fRxHeader.fIsLastPckt) |
|
|
|
{ |
|
|
|
while (!fRxHeader.fIsLastPckt) { |
|
|
|
//how much data is queued on the rx buffer ? |
|
|
|
rx_bytes = Recv(fParams.fMtu, MSG_PEEK); |
|
|
|
|
|
|
|
@@ -975,7 +964,7 @@ namespace Jack |
|
|
|
} |
|
|
|
fTxHeader.fSubCycle = 0; |
|
|
|
fTxHeader.fDataType = 's'; |
|
|
|
fTxHeader.fIsLastPckt = (fParams.fReturnMidiChannels == 0 && fParams.fReturnAudioChannels == 0) ? 1 : 0; |
|
|
|
fTxHeader.fIsLastPckt = (fParams.fReturnMidiChannels == 0 && fParams.fReturnAudioChannels == 0) ? 1 : 0; |
|
|
|
fTxHeader.fPacketSize = fParams.fMtu; |
|
|
|
|
|
|
|
memcpy(fTxBuffer, &fTxHeader, HEADER_SIZE); |
|
|
|
@@ -984,8 +973,7 @@ namespace Jack |
|
|
|
|
|
|
|
int JackNetSlaveInterface::DataSend() |
|
|
|
{ |
|
|
|
uint subproc; |
|
|
|
uint data_size; |
|
|
|
uint subproc, data_size; |
|
|
|
|
|
|
|
//midi |
|
|
|
if (fParams.fReturnMidiChannels > 0) { |
|
|
|
@@ -1009,6 +997,7 @@ namespace Jack |
|
|
|
fTxHeader.fDataType = 'a'; |
|
|
|
data_size = fNetAudioPlaybackBuffer->RenderFromJackPorts(); |
|
|
|
fTxHeader.fNumPacket = fNetAudioPlaybackBuffer->GetNumPackets(); |
|
|
|
|
|
|
|
for (subproc = 0; subproc < fTxHeader.fNumPacket; subproc++) { |
|
|
|
fTxHeader.fSubCycle = subproc; |
|
|
|
fTxHeader.fIsLastPckt = (subproc == (fTxHeader.fNumPacket - 1)) ? 1 : 0; |
|
|
|
|