|
|
|
@@ -23,7 +23,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
|
|
$Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
#include <math.h> |
|
|
|
#include <stdio.h> |
|
|
|
#include <memory.h> |
|
|
|
@@ -35,7 +34,6 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $ |
|
|
|
#include <sys/poll.h> |
|
|
|
|
|
|
|
#include <jack/types.h> |
|
|
|
//#include <jack/internal.h> |
|
|
|
#include <jack/engine.h> |
|
|
|
#include <sysdeps/time.h> |
|
|
|
|
|
|
|
@@ -55,18 +53,16 @@ static jack_transport_state_t last_transport_state; |
|
|
|
static int framecnt; // this is set upon reading a packet. |
|
|
|
// and will be written into the pkthdr of an outgoing packet. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int |
|
|
|
net_driver_sync_cb( jack_transport_state_t state, jack_position_t *pos, net_driver_t *driver ) |
|
|
|
net_driver_sync_cb(jack_transport_state_t state, jack_position_t *pos, net_driver_t *driver) |
|
|
|
{ |
|
|
|
int retval = sync_state; |
|
|
|
|
|
|
|
if ( state == JackTransportStarting && last_transport_state != JackTransportStarting ) { |
|
|
|
if (state == JackTransportStarting && last_transport_state != JackTransportStarting) { |
|
|
|
retval = 0; |
|
|
|
} |
|
|
|
if ( state == JackTransportStarting ) printf( "Starting sync_state = %d\n", sync_state ); |
|
|
|
if (state == JackTransportStarting) |
|
|
|
jack_info("Starting sync_state = %d", sync_state); |
|
|
|
last_transport_state = state; |
|
|
|
return retval; |
|
|
|
} |
|
|
|
@@ -87,7 +83,7 @@ net_driver_wait (net_driver_t *driver, int extra_fd, int *status, |
|
|
|
#if 0 |
|
|
|
fd_set read_fds; |
|
|
|
int res = 0; |
|
|
|
while ( res == 0) { |
|
|
|
while (res == 0) { |
|
|
|
FD_ZERO(&read_fds); |
|
|
|
FD_SET(driver->sockfd, &read_fds); |
|
|
|
res = select(driver->sockfd + 1, &read_fds, NULL, NULL, NULL); // wait here until there is a packet to get |
|
|
|
@@ -96,27 +92,26 @@ net_driver_wait (net_driver_t *driver, int extra_fd, int *status, |
|
|
|
|
|
|
|
socklen_t address_size = sizeof(struct sockaddr_in); |
|
|
|
|
|
|
|
int bufsize = get_sample_size( driver->bitdepth ) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header); |
|
|
|
int bufsize = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header); |
|
|
|
|
|
|
|
jacknet_packet_header *pkthdr = (jacknet_packet_header *)driver->rx_buf; |
|
|
|
|
|
|
|
rx_again: |
|
|
|
if ( !driver->srcaddress_valid ) { |
|
|
|
if (!driver->srcaddress_valid) { |
|
|
|
// XXX: Somthings really bad ;) |
|
|
|
puts("!driver->srcaddress_valid"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int len = netjack_recvfrom( driver->sockfd, (char *)driver->rx_buf, bufsize, |
|
|
|
MSG_WAITALL, (struct sockaddr*) & driver->syncsource_address, &address_size, 1400 ); |
|
|
|
int len = netjack_recvfrom(driver->sockfd, (char *)driver->rx_buf, bufsize, |
|
|
|
MSG_WAITALL, (struct sockaddr*) & driver->syncsource_address, &address_size, 1400); |
|
|
|
|
|
|
|
|
|
|
|
if (len != bufsize) { |
|
|
|
printf( "wrong_packet_len: len=%d, expected=%d\n", len, bufsize ); |
|
|
|
jack_info("wrong_packet_len: len=%d, expected=%d", len, bufsize); |
|
|
|
goto rx_again; |
|
|
|
} |
|
|
|
|
|
|
|
packet_header_ntoh( pkthdr ); |
|
|
|
|
|
|
|
packet_header_ntoh(pkthdr); |
|
|
|
|
|
|
|
//driver->srcaddress_valid = 0; |
|
|
|
|
|
|
|
@@ -149,7 +144,7 @@ net_driver_run_cycle (net_driver_t *driver) |
|
|
|
if (nframes == 0) { |
|
|
|
/* we detected an xrun and restarted: notify |
|
|
|
* clients about the delay. */ |
|
|
|
engine->delay (engine, delayed_usecs ); |
|
|
|
engine->delay (engine, delayed_usecs); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
#endif |
|
|
|
@@ -166,11 +161,11 @@ net_driver_run_cycle (net_driver_t *driver) |
|
|
|
static int |
|
|
|
net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
{ |
|
|
|
//int rx_size = get_sample_size( driver->bitdepth ) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header); |
|
|
|
int tx_size = get_sample_size( driver->bitdepth ) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header); |
|
|
|
//int rx_size = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header); |
|
|
|
int tx_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header); |
|
|
|
unsigned int *packet_buf, *packet_bufX; |
|
|
|
|
|
|
|
packet_buf = alloca( tx_size ); |
|
|
|
packet_buf = alloca( tx_size); |
|
|
|
jacknet_packet_header *tx_pkthdr = (jacknet_packet_header *)packet_buf; |
|
|
|
jacknet_packet_header *rx_pkthdr = (jacknet_packet_header *)driver->rx_buf; |
|
|
|
|
|
|
|
@@ -178,8 +173,6 @@ net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
|
|
|
|
driver->reply_port = rx_pkthdr->reply_port; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// offset packet_bufX by the packetheader. |
|
|
|
packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t); |
|
|
|
|
|
|
|
@@ -188,16 +181,16 @@ net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
tx_pkthdr->framecnt = framecnt; |
|
|
|
|
|
|
|
// memset 0 the payload. |
|
|
|
int payload_size = get_sample_size( driver->bitdepth ) * driver->playback_channels * driver->net_period_up; |
|
|
|
memset( packet_bufX, 0, payload_size ); |
|
|
|
int payload_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up; |
|
|
|
memset(packet_bufX, 0, payload_size); |
|
|
|
|
|
|
|
packet_header_hton( tx_pkthdr ); |
|
|
|
if ( driver->srcaddress_valid ) |
|
|
|
if ( driver->reply_port ) |
|
|
|
driver->syncsource_address.sin_port = htons( driver->reply_port ); |
|
|
|
packet_header_hton(tx_pkthdr); |
|
|
|
if (driver->srcaddress_valid) |
|
|
|
if (driver->reply_port) |
|
|
|
driver->syncsource_address.sin_port = htons(driver->reply_port); |
|
|
|
|
|
|
|
netjack_sendto( driver->outsockfd, (char *)packet_buf, tx_size, |
|
|
|
0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), 1400 ); |
|
|
|
netjack_sendto(driver->outsockfd, (char *)packet_buf, tx_size, |
|
|
|
0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), 1400); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
@@ -205,7 +198,7 @@ net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
static int |
|
|
|
net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
{ |
|
|
|
if ( nframes != driver->period_size ) |
|
|
|
if (nframes != driver->period_size) |
|
|
|
return EINVAL; |
|
|
|
|
|
|
|
return 0; |
|
|
|
@@ -219,72 +212,65 @@ net_driver_read (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
jack_position_t local_trans_pos; |
|
|
|
jack_transport_state_t local_trans_state; |
|
|
|
|
|
|
|
//int bufsize = get_sample_size( driver->bitdepth ) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header); |
|
|
|
//int bufsize = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header); |
|
|
|
unsigned int *packet_buf, *packet_bufX; |
|
|
|
|
|
|
|
packet_buf = driver->rx_buf; |
|
|
|
|
|
|
|
jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t); |
|
|
|
|
|
|
|
//packet_header_ntoh( pkthdr ); |
|
|
|
|
|
|
|
|
|
|
|
//packet_header_ntoh(pkthdr); |
|
|
|
// fill framecnt from pkthdr. |
|
|
|
|
|
|
|
if ( pkthdr->framecnt != framecnt + 1 ) |
|
|
|
printf( "bogus framecount %d\n", pkthdr->framecnt ); |
|
|
|
if (pkthdr->framecnt != framecnt + 1) |
|
|
|
jack_info("bogus framecount %d", pkthdr->framecnt); |
|
|
|
|
|
|
|
framecnt = pkthdr->framecnt; |
|
|
|
driver->reply_port = pkthdr->reply_port; |
|
|
|
|
|
|
|
|
|
|
|
// check whether, we should handle the transport sync stuff, or leave trnasports untouched. |
|
|
|
|
|
|
|
if ( driver->handle_transport_sync ) { |
|
|
|
if (driver->handle_transport_sync) { |
|
|
|
|
|
|
|
// read local transport info.... |
|
|
|
local_trans_state = jack_transport_query( driver->client, &local_trans_pos ); |
|
|
|
|
|
|
|
local_trans_state = jack_transport_query(driver->client, &local_trans_pos); |
|
|
|
|
|
|
|
// Now check if we have to start or stop local transport to sync to remote... |
|
|
|
switch ( pkthdr->transport_state ) { |
|
|
|
switch (pkthdr->transport_state) { |
|
|
|
case JackTransportStarting: |
|
|
|
// the master transport is starting... so we set our reply to the sync_callback; |
|
|
|
if ( local_trans_state == JackTransportStopped ) { |
|
|
|
jack_transport_start( driver->client ); |
|
|
|
if (local_trans_state == JackTransportStopped) { |
|
|
|
ja(ck_transport_start(driver->client); |
|
|
|
last_transport_state = JackTransportStopped; |
|
|
|
sync_state = FALSE; |
|
|
|
printf( "locally stopped... starting... \n" ); |
|
|
|
jack_info("locally stopped... starting..."); |
|
|
|
} |
|
|
|
|
|
|
|
if ( local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes ) ) { |
|
|
|
jack_transport_locate( driver->client, (pkthdr->transport_frame + (pkthdr->latency) * nframes ) ); |
|
|
|
if (local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) { |
|
|
|
jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency) * nframes)); |
|
|
|
last_transport_state = JackTransportRolling; |
|
|
|
sync_state = FALSE; |
|
|
|
printf( "starting locate to %d\n", pkthdr->transport_frame + (pkthdr->latency)*nframes); |
|
|
|
jack_info("starting locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes); |
|
|
|
} |
|
|
|
break; |
|
|
|
case JackTransportStopped: |
|
|
|
sync_state = TRUE; |
|
|
|
if ( local_trans_pos.frame != (pkthdr->transport_frame) ) { |
|
|
|
jack_transport_locate( driver->client, (pkthdr->transport_frame ) ); |
|
|
|
printf( "transport is stopped locate to %d\n", pkthdr->transport_frame); |
|
|
|
if (local_trans_pos.frame != (pkthdr->transport_frame)) { |
|
|
|
jack_transport_locate(driver->client, (pkthdr->transport_frame)); |
|
|
|
jack_info("transport is stopped locate to %d", pkthdr->transport_frame); |
|
|
|
} |
|
|
|
if ( local_trans_state != JackTransportStopped ) |
|
|
|
jack_transport_stop( driver->client ); |
|
|
|
if (local_trans_state != JackTransportStopped) |
|
|
|
jack_transport_stop(driver->client); |
|
|
|
break; |
|
|
|
case JackTransportRolling: |
|
|
|
sync_state = TRUE; |
|
|
|
// if( local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes ) ) { |
|
|
|
// jack_transport_locate( driver->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes ) ); |
|
|
|
// printf( "running locate to %d\n", pkthdr->transport_frame + (pkthdr->latency)*nframes); |
|
|
|
// if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) { |
|
|
|
// jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes)); |
|
|
|
// jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes); |
|
|
|
// } |
|
|
|
if ( local_trans_state != JackTransportRolling ) |
|
|
|
jack_transport_start( driver->client ); |
|
|
|
if (local_trans_state != JackTransportRolling) |
|
|
|
jack_transport_start(driver->client); |
|
|
|
break; |
|
|
|
|
|
|
|
case JackTransportLooping: |
|
|
|
@@ -293,7 +279,7 @@ net_driver_read (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
render_payload_to_jack_ports( driver->bitdepth, packet_bufX, driver->net_period_down, driver->capture_ports, driver->capture_srcs, nframes ); |
|
|
|
render_payload_to_jack_ports(driver->bitdepth, packet_bufX, driver->net_period_down, driver->capture_ports, driver->capture_srcs, nframes); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
@@ -303,9 +289,9 @@ net_driver_write (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
{ |
|
|
|
uint32_t *packet_buf, *packet_bufX; |
|
|
|
|
|
|
|
int packet_size = get_sample_size( driver->bitdepth ) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header); |
|
|
|
int packet_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header); |
|
|
|
|
|
|
|
packet_buf = alloca( packet_size ); |
|
|
|
packet_buf = alloca(packet_size); |
|
|
|
|
|
|
|
jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf; |
|
|
|
|
|
|
|
@@ -315,14 +301,14 @@ net_driver_write (net_driver_t* driver, jack_nframes_t nframes) |
|
|
|
pkthdr->sync_state = (driver->engine->control->sync_remain <= 1); |
|
|
|
pkthdr->framecnt = framecnt; |
|
|
|
|
|
|
|
render_jack_ports_to_payload( driver->bitdepth, driver->playback_ports, driver->playback_srcs, nframes, packet_bufX, driver->net_period_up ); |
|
|
|
render_jack_ports_to_payload(driver->bitdepth, driver->playback_ports, driver->playback_srcs, nframes, packet_bufX, driver->net_period_up); |
|
|
|
|
|
|
|
packet_header_hton( pkthdr ); |
|
|
|
if ( driver->srcaddress_valid ) |
|
|
|
if ( driver->reply_port ) |
|
|
|
driver->syncsource_address.sin_port = htons( driver->reply_port ); |
|
|
|
netjack_sendto( driver->outsockfd, (char *)packet_buf, packet_size, |
|
|
|
0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), 1400 ); |
|
|
|
packet_header_hton(pkthdr); |
|
|
|
if (driver->srcaddress_valid) |
|
|
|
if (driver->reply_port) |
|
|
|
driver->syncsource_address.sin_port = htons(driver->reply_port); |
|
|
|
netjack_sendto(driver->outsockfd, (char *)packet_buf, packet_size, |
|
|
|
0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), 1400); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
@@ -340,8 +326,8 @@ net_driver_attach (net_driver_t *driver) |
|
|
|
driver->engine->set_buffer_size (driver->engine, driver->period_size); |
|
|
|
driver->engine->set_sample_rate (driver->engine, driver->sample_rate); |
|
|
|
|
|
|
|
if ( driver->handle_transport_sync ) |
|
|
|
jack_set_sync_callback( driver->client, (JackSyncCallback) net_driver_sync_cb, driver ); |
|
|
|
if (driver->handle_transport_sync) |
|
|
|
jack_set_sync_callback(driver->client, (JackSyncCallback) net_driver_sync_cb, driver); |
|
|
|
|
|
|
|
port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal; |
|
|
|
|
|
|
|
@@ -358,7 +344,7 @@ net_driver_attach (net_driver_t *driver) |
|
|
|
|
|
|
|
driver->capture_ports = |
|
|
|
jack_slist_append (driver->capture_ports, port); |
|
|
|
driver->capture_srcs = jack_slist_append( driver->capture_srcs, src_new( SRC_LINEAR, 1, NULL ) ); |
|
|
|
driver->capture_srcs = jack_slist_append(driver->capture_srcs, src_new(SRC_LINEAR, 1, NULL)); |
|
|
|
} |
|
|
|
|
|
|
|
port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal; |
|
|
|
@@ -377,11 +363,10 @@ net_driver_attach (net_driver_t *driver) |
|
|
|
|
|
|
|
driver->playback_ports = |
|
|
|
jack_slist_append (driver->playback_ports, port); |
|
|
|
driver->playback_srcs = jack_slist_append( driver->playback_srcs, src_new( SRC_LINEAR, 1, NULL ) ); |
|
|
|
driver->playback_srcs = jack_slist_append(driver->playback_srcs, src_new(SRC_LINEAR, 1, NULL)); |
|
|
|
} |
|
|
|
|
|
|
|
jack_activate (driver->client); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -411,7 +396,6 @@ net_driver_detach (net_driver_t *driver) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
net_driver_delete (net_driver_t *driver) |
|
|
|
{ |
|
|
|
@@ -430,13 +414,13 @@ net_driver_new (jack_client_t * client, |
|
|
|
unsigned int transport_sync, |
|
|
|
unsigned int resample_factor, |
|
|
|
unsigned int resample_factor_up, |
|
|
|
unsigned int bitdepth ) |
|
|
|
unsigned int bitdepth) |
|
|
|
{ |
|
|
|
net_driver_t * driver; |
|
|
|
struct sockaddr_in address; |
|
|
|
|
|
|
|
printf ("creating net driver ... %s|%" PRIu32 "|%" PRIu32 |
|
|
|
"|%u|%u|%u|transport_sync:%u\n", name, sample_rate, period_size, listen_port, |
|
|
|
jack_info("creating net driver ... %s|%" PRIu32 "|%" PRIu32 |
|
|
|
"|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port, |
|
|
|
capture_ports, playback_ports, transport_sync); |
|
|
|
|
|
|
|
driver = (net_driver_t *) calloc (1, sizeof (net_driver_t)); |
|
|
|
@@ -470,65 +454,64 @@ net_driver_new (jack_client_t * client, |
|
|
|
driver->client = client; |
|
|
|
driver->engine = NULL; |
|
|
|
|
|
|
|
if ( (bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16) ) { |
|
|
|
printf( "Invalid bitdepth: %d (8,16 or 0 for float) !!!\n", bitdepth ); |
|
|
|
if ((bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16)) { |
|
|
|
jack_info("Invalid bitdepth: %d (8,16 or 0 for float) !!!", bitdepth); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
driver->bitdepth = bitdepth; |
|
|
|
|
|
|
|
|
|
|
|
if ( resample_factor_up == 0 ) |
|
|
|
if (resample_factor_up == 0) |
|
|
|
resample_factor_up = resample_factor; |
|
|
|
|
|
|
|
// Now open the socket, and wait for the first packet to arrive... |
|
|
|
|
|
|
|
|
|
|
|
driver->sockfd = socket( PF_INET, SOCK_DGRAM, 0 ); |
|
|
|
if ( driver->sockfd == -1 ) { |
|
|
|
printf( "socket error\n" ); |
|
|
|
driver->sockfd = socket(PF_INET, SOCK_DGRAM, 0); |
|
|
|
if (driver->sockfd == -1) { |
|
|
|
jack_info("socket error"); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
address.sin_family = AF_INET; |
|
|
|
address.sin_port = htons( driver->listen_port ); |
|
|
|
address.sin_addr.s_addr = htonl( INADDR_ANY ); |
|
|
|
if ( bind( driver->sockfd, (struct sockaddr *) &address, sizeof(address) ) < 0 ) { |
|
|
|
printf( "bind error\n" ); |
|
|
|
address.sin_port = htons(driver->listen_port); |
|
|
|
address.sin_addr.s_addr = htonl(INADDR_ANY); |
|
|
|
if (bind(driver->sockfd, (struct sockaddr *) &address, sizeof(address)) < 0) { |
|
|
|
jack_info("bind error"); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
driver->outsockfd = socket( PF_INET, SOCK_DGRAM, 0 ); |
|
|
|
if ( driver->sockfd == -1 ) { |
|
|
|
printf( "socket error\n" ); |
|
|
|
driver->outsockfd = socket(PF_INET, SOCK_DGRAM, 0); |
|
|
|
if (driver->sockfd == -1) { |
|
|
|
jack_info("socket error"); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
driver->srcaddress_valid = 0; |
|
|
|
|
|
|
|
jacknet_packet_header *first_packet = alloca( sizeof(jacknet_packet_header) ); |
|
|
|
jacknet_packet_header *first_packet = alloca(sizeof(jacknet_packet_header)); |
|
|
|
socklen_t address_size = sizeof(struct sockaddr_in); |
|
|
|
|
|
|
|
printf( "Waiting for an incoming packet !!!\n\n" ); |
|
|
|
printf( "*** IMPORTANT ***\n Dont connect a client to jackd until the driver is attached to a clock source !!!\n" ); |
|
|
|
|
|
|
|
jack_info("Waiting for an incoming packet !!!"); |
|
|
|
jack_info("*** IMPORTANT *** Dont connect a client to jackd until the driver is attached to a clock source !!!"); |
|
|
|
|
|
|
|
int first_pack_len = recvfrom( driver->sockfd, first_packet, sizeof(jacknet_packet_header), 0, (struct sockaddr*) & driver->syncsource_address, &address_size ); |
|
|
|
int first_pack_len = recvfrom(driver->sockfd, first_packet, sizeof(jacknet_packet_header), 0, (struct sockaddr*) & driver->syncsource_address, &address_size); |
|
|
|
driver->srcaddress_valid = 1; |
|
|
|
|
|
|
|
printf( "first_pack_len=%d\n", first_pack_len ); |
|
|
|
jack_info("first_pack_len=%d", first_pack_len); |
|
|
|
// A packet is here.... If it wasnt the old trigger packet containing only 'x' evaluate the autoconf data... |
|
|
|
|
|
|
|
driver->mtu = 0; |
|
|
|
|
|
|
|
if ( first_pack_len == sizeof(jacknet_packet_header) ) { |
|
|
|
packet_header_ntoh( first_packet ); |
|
|
|
if (first_pack_len == sizeof(jacknet_packet_header)) { |
|
|
|
packet_header_ntoh(first_packet); |
|
|
|
|
|
|
|
printf("AutoConfig Override !!!\n" ); |
|
|
|
if ( driver->sample_rate != first_packet->sample_rate ) { |
|
|
|
printf("AutoConfig Override: sample_rate = %d\n", first_packet->sample_rate ); |
|
|
|
jack_info("AutoConfig Override !!!"); |
|
|
|
if (driver->sample_rate != first_packet->sample_rate) { |
|
|
|
jack_info("AutoConfig Override: sample_rate = %d", first_packet->sample_rate); |
|
|
|
driver->sample_rate = first_packet->sample_rate; |
|
|
|
} |
|
|
|
|
|
|
|
if ( driver->period_size != first_packet->period_size ) { |
|
|
|
printf("AutoConfig Override: period_size = %d\n", first_packet->period_size ); |
|
|
|
if (driver->period_size != first_packet->period_size) { |
|
|
|
jack_info("AutoConfig Override: period_size = %d", first_packet->period_size); |
|
|
|
driver->period_size = first_packet->period_size; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -542,26 +525,21 @@ net_driver_new (jack_client_t * client, |
|
|
|
(jack_time_t) floor ((((float) driver->period_size) / driver->sample_rate) |
|
|
|
* 1000000.0f); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
driver->net_period_down = (float) driver->period_size / (float) resample_factor; |
|
|
|
driver->net_period_up = (float) driver->period_size / (float) resample_factor_up; |
|
|
|
|
|
|
|
driver->rx_buf = malloc( sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size( driver->bitdepth ) ); |
|
|
|
driver->rx_buf = malloc(sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size(driver->bitdepth)); |
|
|
|
|
|
|
|
// XXX: dont need it when packet size < mtu |
|
|
|
driver->pkt_buf = malloc( sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size( driver->bitdepth ) ); |
|
|
|
|
|
|
|
int rx_bufsize = sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size( driver->bitdepth ); |
|
|
|
global_packcache = packet_cache_new( driver->latency + 5, rx_bufsize, 1400 ); |
|
|
|
|
|
|
|
printf( "net_period: (up:%d/dn:%d)\n", driver->net_period_up, driver->net_period_down ); |
|
|
|
driver->pkt_buf = malloc(sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size(driver->bitdepth)); |
|
|
|
|
|
|
|
int rx_bufsize = sizeof(jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size(driver->bitdepth); |
|
|
|
global_packcache = packet_cache_new(driver->latency + 5, rx_bufsize, 1400); |
|
|
|
|
|
|
|
jack_info("net_period: (up:%d/dn:%d)", driver->net_period_up, driver->net_period_down); |
|
|
|
return (jack_driver_t *) driver; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* DRIVER "PLUGIN" INTERFACE */ |
|
|
|
|
|
|
|
jack_driver_desc_t * |
|
|
|
@@ -716,11 +694,9 @@ driver_initialize (jack_client_t *client, const JSList * params) |
|
|
|
case 't': |
|
|
|
handle_transport_sync = param->value.ui; |
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return net_driver_new (client, "net_pcm", capture_ports, |
|
|
|
playback_ports, sample_rate, period_size, |
|
|
|
listen_port, handle_transport_sync, |
|
|
|
|