From 8efd91c730f837fe8edd55266dce099f740d17ec Mon Sep 17 00:00:00 2001 From: "Ruslan N. Marchenko" Date: Sun, 10 Feb 2013 21:49:17 +0100 Subject: [PATCH] Added multicast interface selection to NetManager --- common/JackNetManager.cpp | 25 ++++++++++++++++++++++--- common/JackNetManager.h | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index 23b8fd03..e970fb82 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -464,7 +464,7 @@ namespace Jack if (out) { memset(out, 0, sizeof(float) * fParams.fPeriodSize); } - fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, out))); + fNetAudioPlaybackBuffer->SetBuffer(audio_port_index, out); #endif } @@ -550,6 +550,13 @@ namespace Jack strcpy(fMulticastIP, DEFAULT_MULTICAST_IP); } + const char* default_multicast_if = getenv("JACK_NETJACK_INTERFACE"); + if (default_multicast_if) { + strcpy(fMulticastIF, default_multicast_if); + } else { + strcpy(fMulticastIF, DEFAULT_MULTICAST_IF); + } + for (node = params; node; node = jack_slist_next(node)) { param = (const jack_driver_param_t*) node->data; @@ -563,6 +570,14 @@ namespace Jack } break; + case 'f' : + if (strlen(param->value.str) < 32) { + strcpy(fMulticastIF, param->value.str); + } else { + jack_error("Can't use multicast interface %s, using default %s", param->value.ui, DEFAULT_MULTICAST_IF); + } + break; + case 'p': fSocket.SetPort(param->value.ui); break; @@ -655,7 +670,7 @@ namespace Jack { JackNetMasterManager* master_manager = static_cast(arg); jack_info("Starting Jack NetManager"); - jack_info("Listening on '%s:%d'", master_manager->fMulticastIP, master_manager->fSocket.GetPort()); + jack_info("Listening on '%s:%d%%%s'", master_manager->fMulticastIP, master_manager->fSocket.GetPort(),master_manager->fMulticastIF); master_manager->Run(); return NULL; } @@ -691,7 +706,7 @@ namespace Jack } //join multicast group - if (fSocket.JoinMCastGroup(fMulticastIP) == SOCKET_ERROR) { + if (fSocket.JoinMCastGroup(fMulticastIP,fMulticastIF) == SOCKET_ERROR) { jack_error("Can't join multicast group : %s", StrError(NET_ERROR_CODE)); } @@ -737,6 +752,7 @@ namespace Jack } break; default: + jack_log("JackNetMasterManager::Run: read: %d; type: %d; peer: %s",rx_bytes,host_params.fPacketID,host_params.fName); break; } } @@ -825,6 +841,9 @@ extern "C" strcpy(value.str, DEFAULT_MULTICAST_IP); jack_driver_descriptor_add_parameter(desc, &filler, "multicast-ip", 'a', JackDriverParamString, &value, NULL, "Multicast address", NULL); + strcpy(value.str, DEFAULT_MULTICAST_IF); + jack_driver_descriptor_add_parameter(desc, &filler, "multicast-if", 'f', JackDriverParamString, &value, NULL, "Multicast interface", "Multicast interface to bind to. ('all' - all ip ifs; 'any' (default) kernel chosen; ifname i.e. eth0)"); + value.i = DEFAULT_PORT; jack_driver_descriptor_add_parameter(desc, &filler, "udp-net-port", 'p', JackDriverParamInt, &value, NULL, "UDP port", NULL); diff --git a/common/JackNetManager.h b/common/JackNetManager.h index c88a09ba..e5c0a48e 100644 --- a/common/JackNetManager.h +++ b/common/JackNetManager.h @@ -105,6 +105,7 @@ namespace Jack jack_client_t* fClient; const char* fName; char fMulticastIP[32]; + char fMulticastIF[32]; JackNetSocket fSocket; jack_native_thread_t fThread; master_list_t fMasterList;