summaryrefslogtreecommitdiff
path: root/drivers/netjack/net_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/netjack/net_driver.c')
-rw-r--r--drivers/netjack/net_driver.c1114
1 files changed, 562 insertions, 552 deletions
diff --git a/drivers/netjack/net_driver.c b/drivers/netjack/net_driver.c
index 7f7c1d5..ab3d447 100644
--- a/drivers/netjack/net_driver.c
+++ b/drivers/netjack/net_driver.c
@@ -1,28 +1,28 @@
/* -*- mode: c; c-file-style: "linux"; -*- */
/*
-NetJack Driver
+ NetJack Driver
-Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
-Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
-Copyright (C) 2003 Robert Ham <rah@bash.sh>
-Copyright (C) 2001 Paul Davis
+ Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
+ Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
+ Copyright (C) 2003 Robert Ham <rah@bash.sh>
+ Copyright (C) 2001 Paul Davis
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-$Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
-*/
+ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
+ */
#include <math.h>
#include <stdio.h>
@@ -49,7 +49,7 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
#undef DEBUG_WAKEUP
-#define MIN(x,y) ((x)<(y) ? (x) : (y))
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
static jack_transport_state_t last_transport_state;
static int sync_state = TRUE;
@@ -57,276 +57,286 @@ static int sync_state = TRUE;
static jack_nframes_t
net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed_usecs)
{
- netjack_driver_state_t *netj = &( driver->netj );
- int delay;
-
- delay = netjack_wait( netj, driver->engine->get_microseconds );
- if( delay ) {
- //driver->engine->delay( driver->engine, (float)delay );
- jack_error( "netxruns amount: %dms", delay/1000 );
- }
-
-
- driver->last_wait_ust = driver->engine->get_microseconds ();
- driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
-
- /* this driver doesn't work so well if we report a delay */
- /* XXX: this might not be the case anymore */
- /* the delayed _usecs is a resync or something. */
- *delayed_usecs = 0; /* lie about it */
- *status = 0;
- return netj->period_size;
-}
+ netjack_driver_state_t *netj = &( driver->netj );
+ int delay;
-static int
-net_driver_run_cycle (net_driver_t *driver)
-{
- jack_engine_t *engine = driver->engine;
- //netjack_driver_state_t *netj = &(driver->netj);
- int wait_status = -1;
- float delayed_usecs;
+ delay = netjack_wait ( netj, driver->engine->get_microseconds );
+ if ( delay ) {
+ //driver->engine->delay( driver->engine, (float)delay );
+ jack_error ( "netxruns amount: %dms", delay / 1000 );
+ }
- jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
- &delayed_usecs);
- // XXX: xrun code removed.
- // especially with celt there are no real xruns anymore.
- // things are different on the net.
+ driver->last_wait_ust = driver->engine->get_microseconds ();
+ driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
- if (wait_status == 0)
- return engine->run_cycle (engine, nframes, delayed_usecs);
+ /* this driver doesn't work so well if we report a delay */
+ /* XXX: this might not be the case anymore */
+ /* the delayed _usecs is a resync or something. */
+ *delayed_usecs = 0; /* lie about it */
+ *status = 0;
+ return netj->period_size;
+}
- if (wait_status < 0)
- return -1;
- else
- return 0;
+static int
+net_driver_run_cycle (net_driver_t *driver)
+{
+ jack_engine_t *engine = driver->engine;
+ //netjack_driver_state_t *netj = &(driver->netj);
+ int wait_status = -1;
+ float delayed_usecs;
+
+ jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
+ &delayed_usecs);
+
+ // XXX: xrun code removed.
+ // especially with celt there are no real xruns anymore.
+ // things are different on the net.
+
+ if (wait_status == 0) {
+ return engine->run_cycle (engine, nframes, delayed_usecs);
+ }
+
+ if (wait_status < 0) {
+ return -1;
+ } else {
+ return 0;
+ }
}
static int
net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes)
{
- // TODO: talk to paul about this.
- // do i wait here ?
- // just sending out a packet marked with junk ?
+ // TODO: talk to paul about this.
+ // do i wait here ?
+ // just sending out a packet marked with junk ?
- netjack_driver_state_t *netj = &(driver->netj);
- int sync_state = (driver->engine->control->sync_remain <= 1);
- netjack_send_silence( netj, sync_state );
+ netjack_driver_state_t *netj = &(driver->netj);
+ int sync_state = (driver->engine->control->sync_remain <= 1);
- return 0;
+ netjack_send_silence ( netj, sync_state );
+
+ return 0;
}
static int
net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes)
{
- netjack_driver_state_t *netj = &(driver->netj);
- if (nframes != netj->period_size)
- return EINVAL;
+ netjack_driver_state_t *netj = &(driver->netj);
- return 0;
+ if (nframes != netj->period_size) {
+ return EINVAL;
+ }
+
+ return 0;
}
static int
net_driver_read (net_driver_t* driver, jack_nframes_t nframes)
{
- netjack_driver_state_t *netj = &(driver->netj);
-
- jack_position_t local_trans_pos;
- jack_transport_state_t local_trans_state;
-
- unsigned int *packet_buf, *packet_bufX;
-
- if( ! netj->packet_data_valid ) {
- render_payload_to_jack_ports (netj->bitdepth, NULL, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
- return 0;
- }
- packet_buf = netj->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);
-
- netj->reply_port = pkthdr->reply_port;
- netj->latency = pkthdr->latency;
-
- // Special handling for latency=0
- if( netj->latency == 0 )
- netj->resync_threshold = 0;
- else
- netj->resync_threshold = MIN( 15, pkthdr->latency-1 );
-
- // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
- if (netj->handle_transport_sync) {
- int compensated_tranport_pos = (pkthdr->transport_frame + (pkthdr->latency * nframes) + netj->codec_latency);
-
- // read local transport info....
- local_trans_state = jack_transport_query(netj->client, &local_trans_pos);
-
- // Now check if we have to start or stop local transport to sync to remote...
- 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(netj->client);
- last_transport_state = JackTransportStopped;
- sync_state = FALSE;
- jack_info("locally stopped... starting...");
- }
-
- if (local_trans_pos.frame != compensated_tranport_pos)
- {
- jack_transport_locate(netj->client, compensated_tranport_pos);
- last_transport_state = JackTransportRolling;
- sync_state = FALSE;
- jack_info("starting locate to %d", compensated_tranport_pos );
- }
- break;
- case JackTransportStopped:
- sync_state = TRUE;
- if (local_trans_pos.frame != (pkthdr->transport_frame)) {
- jack_transport_locate(netj->client, (pkthdr->transport_frame));
- jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
- }
- if (local_trans_state != JackTransportStopped)
- jack_transport_stop(netj->client);
- break;
- case JackTransportRolling:
- sync_state = TRUE;
-// if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
+ netjack_driver_state_t *netj = &(driver->netj);
+
+ jack_position_t local_trans_pos;
+ jack_transport_state_t local_trans_state;
+
+ unsigned int *packet_buf, *packet_bufX;
+
+ if ( !netj->packet_data_valid ) {
+ render_payload_to_jack_ports (netj->bitdepth, NULL, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
+ return 0;
+ }
+ packet_buf = netj->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);
+
+ netj->reply_port = pkthdr->reply_port;
+ netj->latency = pkthdr->latency;
+
+ // Special handling for latency=0
+ if ( netj->latency == 0 ) {
+ netj->resync_threshold = 0;
+ } else {
+ netj->resync_threshold = MIN ( 15, pkthdr->latency - 1 );
+ }
+
+ // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
+ if (netj->handle_transport_sync) {
+ int compensated_tranport_pos = (pkthdr->transport_frame + (pkthdr->latency * nframes) + netj->codec_latency);
+
+ // read local transport info....
+ local_trans_state = jack_transport_query (netj->client, &local_trans_pos);
+
+ // Now check if we have to start or stop local transport to sync to remote...
+ 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 (netj->client);
+ last_transport_state = JackTransportStopped;
+ sync_state = FALSE;
+ jack_info ("locally stopped... starting...");
+ }
+
+ if (local_trans_pos.frame != compensated_tranport_pos) {
+ jack_transport_locate (netj->client, compensated_tranport_pos);
+ last_transport_state = JackTransportRolling;
+ sync_state = FALSE;
+ jack_info ("starting locate to %d", compensated_tranport_pos );
+ }
+ break;
+ case JackTransportStopped:
+ sync_state = TRUE;
+ if (local_trans_pos.frame != (pkthdr->transport_frame)) {
+ jack_transport_locate (netj->client, (pkthdr->transport_frame));
+ jack_info ("transport is stopped locate to %d", pkthdr->transport_frame);
+ }
+ if (local_trans_state != JackTransportStopped) {
+ jack_transport_stop (netj->client);
+ }
+ break;
+ case JackTransportRolling:
+ sync_state = TRUE;
+// if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
// jack_transport_locate(netj->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 (netj->client);
- break;
+// }
+ if (local_trans_state != JackTransportRolling) {
+ jack_transport_start (netj->client);
+ }
+ break;
- case JackTransportLooping:
- break;
- }
- }
+ case JackTransportLooping:
+ break;
+ }
+ }
- render_payload_to_jack_ports (netj->bitdepth, packet_bufX, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
- packet_cache_release_packet(netj->packcache, netj->expected_framecnt );
+ render_payload_to_jack_ports (netj->bitdepth, packet_bufX, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
+ packet_cache_release_packet (netj->packcache, netj->expected_framecnt );
- return 0;
+ return 0;
}
static int
net_driver_write (net_driver_t* driver, jack_nframes_t nframes)
{
- netjack_driver_state_t *netj = &(driver->netj);
+ netjack_driver_state_t *netj = &(driver->netj);
- int sync_state = (driver->engine->control->sync_remain <= 1);;
+ int sync_state = (driver->engine->control->sync_remain <= 1);;
- uint32_t *packet_buf, *packet_bufX;
+ uint32_t *packet_buf, *packet_bufX;
- int packet_size = get_sample_size(netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
- jacknet_packet_header *pkthdr;
+ int packet_size = get_sample_size (netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
+ jacknet_packet_header *pkthdr;
- packet_buf = alloca(packet_size);
- pkthdr = (jacknet_packet_header *)packet_buf;
+ packet_buf = alloca (packet_size);
+ pkthdr = (jacknet_packet_header*)packet_buf;
- if( netj->running_free ) {
- return 0;
- }
-
- // offset packet_bufX by the packetheader.
- packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
-
- // clear unused header fields
- pkthdr->capture_channels_audio = 0;
- pkthdr->playback_channels_audio = 0;
- pkthdr->capture_channels_midi = 0;
- pkthdr->playback_channels_midi = 0;
- pkthdr->period_size = 0;
- pkthdr->sample_rate = 0;
- pkthdr->transport_frame = 0;
- pkthdr->transport_state = 0;
- pkthdr->framecnt = 0;
- pkthdr->reply_port = 0;
- pkthdr->mtu = 0;
-
- // set used header fields
- pkthdr->sync_state = sync_state;
- pkthdr->latency = netj->time_to_deadline;
- //printf( "time to deadline = %d goodness=%d\n", (int)netj->time_to_deadline, netj->deadline_goodness );
- pkthdr->framecnt = netj->expected_framecnt;
-
-
- render_jack_ports_to_payload(netj->bitdepth, netj->playback_ports, netj->playback_srcs, nframes, packet_bufX, netj->net_period_up, netj->dont_htonl_floats );
-
- packet_header_hton(pkthdr);
- if (netj->srcaddress_valid)
- {
- int r;
+ if ( netj->running_free ) {
+ return 0;
+ }
+
+ // offset packet_bufX by the packetheader.
+ packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
+
+ // clear unused header fields
+ pkthdr->capture_channels_audio = 0;
+ pkthdr->playback_channels_audio = 0;
+ pkthdr->capture_channels_midi = 0;
+ pkthdr->playback_channels_midi = 0;
+ pkthdr->period_size = 0;
+ pkthdr->sample_rate = 0;
+ pkthdr->transport_frame = 0;
+ pkthdr->transport_state = 0;
+ pkthdr->framecnt = 0;
+ pkthdr->reply_port = 0;
+ pkthdr->mtu = 0;
+
+ // set used header fields
+ pkthdr->sync_state = sync_state;
+ pkthdr->latency = netj->time_to_deadline;
+ //printf( "time to deadline = %d goodness=%d\n", (int)netj->time_to_deadline, netj->deadline_goodness );
+ pkthdr->framecnt = netj->expected_framecnt;
+
+
+ render_jack_ports_to_payload (netj->bitdepth, netj->playback_ports, netj->playback_srcs, nframes, packet_bufX, netj->net_period_up, netj->dont_htonl_floats );
+
+ packet_header_hton (pkthdr);
+ if (netj->srcaddress_valid) {
+ int r;
#ifndef MSG_CONFIRM
- static const int flag = 0;
+ static const int flag = 0;
#else
- static const int flag = MSG_CONFIRM;
+ static const int flag = MSG_CONFIRM;
#endif
- if (netj->reply_port)
- netj->syncsource_address.sin_port = htons(netj->reply_port);
+ if (netj->reply_port) {
+ netj->syncsource_address.sin_port = htons (netj->reply_port);
+ }
- for( r=0; r<netj->redundancy; r++ )
- netjack_sendto(netj->sockfd, (char *)packet_buf, packet_size,
- flag, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
- }
+ for ( r = 0; r < netj->redundancy; r++ )
+ netjack_sendto (netj->sockfd, (char*)packet_buf, packet_size,
+ flag, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
+ }
- return 0;
+ return 0;
}
static int
net_driver_attach (net_driver_t *driver)
{
- netjack_driver_state_t *netj = &( driver->netj );
- if (driver->engine->set_buffer_size (driver->engine, netj->period_size)) {
- jack_error ("netjack: cannot set engine buffer size to %d (check MIDI)", netj->period_size);
- return -1;
- }
- driver->engine->set_sample_rate (driver->engine, netj->sample_rate);
-
- netjack_attach( netj );
- return 0;
+ netjack_driver_state_t *netj = &( driver->netj );
+
+ if (driver->engine->set_buffer_size (driver->engine, netj->period_size)) {
+ jack_error ("netjack: cannot set engine buffer size to %d (check MIDI)", netj->period_size);
+ return -1;
+ }
+ driver->engine->set_sample_rate (driver->engine, netj->sample_rate);
+
+ netjack_attach ( netj );
+ return 0;
}
static int
net_driver_detach (net_driver_t *driver)
{
- netjack_driver_state_t *netj = &( driver->netj );
+ netjack_driver_state_t *netj = &( driver->netj );
- if (driver->engine == 0)
- return 0;
+ if (driver->engine == 0) {
+ return 0;
+ }
- netjack_detach( netj );
- return 0;
+ netjack_detach ( netj );
+ return 0;
}
static void
net_driver_delete (net_driver_t *driver)
{
- netjack_driver_state_t *netj = &( driver->netj );
- netjack_release( netj );
- jack_driver_nt_finish ((jack_driver_nt_t *) driver);
- free (driver);
+ netjack_driver_state_t *netj = &( driver->netj );
+
+ netjack_release ( netj );
+ jack_driver_nt_finish ((jack_driver_nt_t*)driver);
+ free (driver);
}
static jack_driver_t *
net_driver_new (jack_client_t * client,
- char *name,
- unsigned int capture_ports,
- unsigned int playback_ports,
- unsigned int capture_ports_midi,
- unsigned int playback_ports_midi,
- jack_nframes_t sample_rate,
- jack_nframes_t period_size,
- unsigned int listen_port,
- unsigned int transport_sync,
- unsigned int resample_factor,
- unsigned int resample_factor_up,
- unsigned int bitdepth,
+ char *name,
+ unsigned int capture_ports,
+ unsigned int playback_ports,
+ unsigned int capture_ports_midi,
+ unsigned int playback_ports_midi,
+ jack_nframes_t sample_rate,
+ jack_nframes_t period_size,
+ unsigned int listen_port,
+ unsigned int transport_sync,
+ unsigned int resample_factor,
+ unsigned int resample_factor_up,
+ unsigned int bitdepth,
unsigned int use_autoconfig,
unsigned int latency,
unsigned int redundancy,
@@ -334,60 +344,60 @@ net_driver_new (jack_client_t * client,
int always_deadline,
int jitter_val)
{
- net_driver_t * driver;
-
- 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));
-
- jack_driver_nt_init ((jack_driver_nt_t *) driver);
-
- driver->write = (JackDriverWriteFunction) net_driver_write;
- driver->read = (JackDriverReadFunction) net_driver_read;
- driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
- driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
- driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
- driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
- driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
-
- driver->last_wait_ust = 0;
- driver->engine = NULL;
-
- netjack_driver_state_t *netj = &(driver->netj);
-
- netjack_init ( netj,
- client,
- name,
- capture_ports,
- playback_ports,
- capture_ports_midi,
- playback_ports_midi,
- sample_rate,
- period_size,
- listen_port,
- transport_sync,
- resample_factor,
- resample_factor_up,
- bitdepth,
- use_autoconfig,
- latency,
- redundancy,
- dont_htonl_floats,
- always_deadline,
- jitter_val );
-
- netjack_startup( netj );
-
- jack_info ("netjack: period : up: %d / dn: %d", netj->net_period_up, netj->net_period_down);
- jack_info ("netjack: framerate: %d", netj->sample_rate);
- jack_info ("netjack: audio : cap: %d / pbk: %d)", netj->capture_channels_audio, netj->playback_channels_audio);
- jack_info ("netjack: midi : cap: %d / pbk: %d)", netj->capture_channels_midi, netj->playback_channels_midi);
- jack_info ("netjack: buffsize : rx: %d)", netj->rx_bufsize);
- driver->period_usecs = netj->period_usecs;
-
- return (jack_driver_t *) driver;
+ net_driver_t * driver;
+
+ 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));
+
+ jack_driver_nt_init ((jack_driver_nt_t*)driver);
+
+ driver->write = (JackDriverWriteFunction)net_driver_write;
+ driver->read = (JackDriverReadFunction)net_driver_read;
+ driver->null_cycle = (JackDriverNullCycleFunction)net_driver_null_cycle;
+ driver->nt_attach = (JackDriverNTAttachFunction)net_driver_attach;
+ driver->nt_detach = (JackDriverNTDetachFunction)net_driver_detach;
+ driver->nt_bufsize = (JackDriverNTBufSizeFunction)net_driver_bufsize;
+ driver->nt_run_cycle = (JackDriverNTRunCycleFunction)net_driver_run_cycle;
+
+ driver->last_wait_ust = 0;
+ driver->engine = NULL;
+
+ netjack_driver_state_t *netj = &(driver->netj);
+
+ netjack_init ( netj,
+ client,
+ name,
+ capture_ports,
+ playback_ports,
+ capture_ports_midi,
+ playback_ports_midi,
+ sample_rate,
+ period_size,
+ listen_port,
+ transport_sync,
+ resample_factor,
+ resample_factor_up,
+ bitdepth,
+ use_autoconfig,
+ latency,
+ redundancy,
+ dont_htonl_floats,
+ always_deadline,
+ jitter_val );
+
+ netjack_startup ( netj );
+
+ jack_info ("netjack: period : up: %d / dn: %d", netj->net_period_up, netj->net_period_down);
+ jack_info ("netjack: framerate: %d", netj->sample_rate);
+ jack_info ("netjack: audio : cap: %d / pbk: %d)", netj->capture_channels_audio, netj->playback_channels_audio);
+ jack_info ("netjack: midi : cap: %d / pbk: %d)", netj->capture_channels_midi, netj->playback_channels_midi);
+ jack_info ("netjack: buffsize : rx: %d)", netj->rx_bufsize);
+ driver->period_usecs = netj->period_usecs;
+
+ return (jack_driver_t*)driver;
}
/* DRIVER "PLUGIN" INTERFACE */
@@ -395,173 +405,173 @@ net_driver_new (jack_client_t * client,
jack_driver_desc_t *
driver_get_descriptor ()
{
- jack_driver_desc_t * desc;
- jack_driver_param_desc_t * params;
- unsigned int i;
-
- desc = calloc (1, sizeof (jack_driver_desc_t));
- strcpy (desc->name, "net");
- desc->nparams = 18;
-
- params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
-
- i = 0;
- strcpy (params[i].name, "audio-ins");
- params[i].character = 'i';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 2U;
- strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "audio-outs");
- params[i].character = 'o';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 2U;
- strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "midi-ins");
- params[i].character = 'I';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "midi-outs");
- params[i].character = 'O';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "rate");
- params[i].character = 'r';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 48000U;
- strcpy (params[i].short_desc, "Sample rate");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "period");
- params[i].character = 'p';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1024U;
- strcpy (params[i].short_desc, "Frames per period");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "num-periods");
- params[i].character = 'n';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 5U;
- strcpy (params[i].short_desc,
- "Network latency setting in no. of periods");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "listen-port");
- params[i].character = 'l';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 3000U;
- strcpy (params[i].short_desc,
- "The socket port we are listening on for sync packets");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "factor");
- params[i].character = 'f';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Factor for sample rate reduction (deprecated)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "upstream-factor");
- params[i].character = 'u';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Factor for sample rate reduction on the upstream (deprecated)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "celt");
- params[i].character = 'c';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "sets celt encoding and kbits value one channel is encoded at");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "bit-depth");
- params[i].character = 'b';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "transport-sync");
- params[i].character = 't';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Whether to slave the transport to the master transport");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "autoconf");
- params[i].character = 'a';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Whether to use Autoconfig, or just start.");
- strcpy (params[i].long_desc, params[i].short_desc);
- i++;
- strcpy (params[i].name, "redundancy");
- params[i].character = 'R';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 1U;
- strcpy (params[i].short_desc,
- "Send packets N times");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "native-endian");
- params[i].character = 'e';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Don't convert samples to network byte order.");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "jitterval");
- params[i].character = 'J';
- params[i].type = JackDriverParamInt;
- params[i].value.i = 0;
- strcpy (params[i].short_desc,
- "attempted jitterbuffer microseconds on master");
- strcpy (params[i].long_desc, params[i].short_desc);
-
- i++;
- strcpy (params[i].name, "always-deadline");
- params[i].character = 'D';
- params[i].type = JackDriverParamUInt;
- params[i].value.ui = 0U;
- strcpy (params[i].short_desc,
- "Always wait until deadline");
- strcpy (params[i].long_desc, params[i].short_desc);
- desc->params = params;
-
- return desc;
+ jack_driver_desc_t * desc;
+ jack_driver_param_desc_t * params;
+ unsigned int i;
+
+ desc = calloc (1, sizeof(jack_driver_desc_t));
+ strcpy (desc->name, "net");
+ desc->nparams = 18;
+
+ params = calloc (desc->nparams, sizeof(jack_driver_param_desc_t));
+
+ i = 0;
+ strcpy (params[i].name, "audio-ins");
+ params[i].character = 'i';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 2U;
+ strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "audio-outs");
+ params[i].character = 'o';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 2U;
+ strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "midi-ins");
+ params[i].character = 'I';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "midi-outs");
+ params[i].character = 'O';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "rate");
+ params[i].character = 'r';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 48000U;
+ strcpy (params[i].short_desc, "Sample rate");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "period");
+ params[i].character = 'p';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1024U;
+ strcpy (params[i].short_desc, "Frames per period");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "num-periods");
+ params[i].character = 'n';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 5U;
+ strcpy (params[i].short_desc,
+ "Network latency setting in no. of periods");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "listen-port");
+ params[i].character = 'l';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 3000U;
+ strcpy (params[i].short_desc,
+ "The socket port we are listening on for sync packets");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "factor");
+ params[i].character = 'f';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Factor for sample rate reduction (deprecated)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "upstream-factor");
+ params[i].character = 'u';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Factor for sample rate reduction on the upstream (deprecated)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "celt");
+ params[i].character = 'c';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "sets celt encoding and kbits value one channel is encoded at");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "bit-depth");
+ params[i].character = 'b';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "transport-sync");
+ params[i].character = 't';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Whether to slave the transport to the master transport");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "autoconf");
+ params[i].character = 'a';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Whether to use Autoconfig, or just start.");
+ strcpy (params[i].long_desc, params[i].short_desc);
+ i++;
+ strcpy (params[i].name, "redundancy");
+ params[i].character = 'R';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 1U;
+ strcpy (params[i].short_desc,
+ "Send packets N times");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "native-endian");
+ params[i].character = 'e';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Don't convert samples to network byte order.");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "jitterval");
+ params[i].character = 'J';
+ params[i].type = JackDriverParamInt;
+ params[i].value.i = 0;
+ strcpy (params[i].short_desc,
+ "attempted jitterbuffer microseconds on master");
+ strcpy (params[i].long_desc, params[i].short_desc);
+
+ i++;
+ strcpy (params[i].name, "always-deadline");
+ params[i].character = 'D';
+ params[i].type = JackDriverParamUInt;
+ params[i].value.ui = 0U;
+ strcpy (params[i].short_desc,
+ "Always wait until deadline");
+ strcpy (params[i].long_desc, params[i].short_desc);
+ desc->params = params;
+
+ return desc;
}
const char driver_client_name[] = "net_pcm";
@@ -569,130 +579,130 @@ const char driver_client_name[] = "net_pcm";
jack_driver_t *
driver_initialize (jack_client_t *client, const JSList * params)
{
- jack_nframes_t sample_rate = 48000;
- jack_nframes_t resample_factor = 1;
- jack_nframes_t period_size = 1024;
- unsigned int capture_ports = 2;
- unsigned int playback_ports = 2;
- unsigned int capture_ports_midi = 1;
- unsigned int playback_ports_midi = 1;
- unsigned int listen_port = 3000;
- unsigned int resample_factor_up = 0;
- unsigned int bitdepth = 0;
- unsigned int handle_transport_sync = 1;
- unsigned int use_autoconfig = 1;
- unsigned int latency = 5;
- unsigned int redundancy = 1;
- int dont_htonl_floats = 0;
- int always_deadline = 0;
- int jitter_val = 0;
- const JSList * node;
- const jack_driver_param_t * param;
-
- for (node = params; node; node = jack_slist_next (node)) {
- param = (const jack_driver_param_t *) node->data;
-
- switch (param->character) {
-
- case 'i':
- capture_ports = param->value.ui;
- break;
-
- case 'o':
- playback_ports = param->value.ui;
- break;
-
- case 'I':
- capture_ports_midi = param->value.ui;
- break;
-
- case 'O':
- playback_ports_midi = param->value.ui;
- break;
-
- case 'r':
- sample_rate = param->value.ui;
- break;
-
- case 'p':
- period_size = param->value.ui;
- break;
-
- case 'l':
- listen_port = param->value.ui;
- break;
-
- case 'f':
+ jack_nframes_t sample_rate = 48000;
+ jack_nframes_t resample_factor = 1;
+ jack_nframes_t period_size = 1024;
+ unsigned int capture_ports = 2;
+ unsigned int playback_ports = 2;
+ unsigned int capture_ports_midi = 1;
+ unsigned int playback_ports_midi = 1;
+ unsigned int listen_port = 3000;
+ unsigned int resample_factor_up = 0;
+ unsigned int bitdepth = 0;
+ unsigned int handle_transport_sync = 1;
+ unsigned int use_autoconfig = 1;
+ unsigned int latency = 5;
+ unsigned int redundancy = 1;
+ int dont_htonl_floats = 0;
+ int always_deadline = 0;
+ int jitter_val = 0;
+ const JSList * node;
+ const jack_driver_param_t * param;
+
+ for (node = params; node; node = jack_slist_next (node)) {
+ param = (const jack_driver_param_t*)node->data;
+
+ switch (param->character) {
+
+ case 'i':
+ capture_ports = param->value.ui;
+ break;
+
+ case 'o':
+ playback_ports = param->value.ui;
+ break;
+
+ case 'I':
+ capture_ports_midi = param->value.ui;
+ break;
+
+ case 'O':
+ playback_ports_midi = param->value.ui;
+ break;
+
+ case 'r':
+ sample_rate = param->value.ui;
+ break;
+
+ case 'p':
+ period_size = param->value.ui;
+ break;
+
+ case 'l':
+ listen_port = param->value.ui;
+ break;
+
+ case 'f':
#if HAVE_SAMPLERATE
- resample_factor = param->value.ui;
+ resample_factor = param->value.ui;
#else
- printf( "not built with libsamplerate support\n" );
- exit(10);
+ printf ( "not built with libsamplerate support\n" );
+ exit (10);
#endif
- break;
+ break;
- case 'u':
+ case 'u':
#if HAVE_SAMPLERATE
- resample_factor_up = param->value.ui;
+ resample_factor_up = param->value.ui;
#else
- printf( "not built with libsamplerate support\n" );
- exit(10);
+ printf ( "not built with libsamplerate support\n" );
+ exit (10);
#endif
- break;
+ break;
- case 'b':
- bitdepth = param->value.ui;
- break;
+ case 'b':
+ bitdepth = param->value.ui;
+ break;
- case 'c':
+ case 'c':
#if HAVE_CELT
- bitdepth = 1000;
- resample_factor = param->value.ui;
+ bitdepth = 1000;
+ resample_factor = param->value.ui;
#else
- printf( "not built with celt support\n" );
- exit(10);
+ printf ( "not built with celt support\n" );
+ exit (10);
#endif
- break;
-
- case 't':
- handle_transport_sync = param->value.ui;
- break;
-
- case 'a':
- use_autoconfig = param->value.ui;
- break;
-
- case 'n':
- latency = param->value.ui;
- break;
-
- case 'R':
- redundancy = param->value.ui;
- break;
-
- case 'e':
- dont_htonl_floats = param->value.ui;
- break;
- case 'J':
- jitter_val = param->value.i;
- break;
- case 'D':
- always_deadline = param->value.ui;
- break;
- }
- }
-
- return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
- capture_ports_midi, playback_ports_midi,
- sample_rate, period_size,
- listen_port, handle_transport_sync,
- resample_factor, resample_factor_up, bitdepth,
- use_autoconfig, latency, redundancy,
- dont_htonl_floats, always_deadline, jitter_val);
+ break;
+
+ case 't':
+ handle_transport_sync = param->value.ui;
+ break;
+
+ case 'a':
+ use_autoconfig = param->value.ui;
+ break;
+
+ case 'n':
+ latency = param->value.ui;
+ break;
+
+ case 'R':
+ redundancy = param->value.ui;
+ break;
+
+ case 'e':
+ dont_htonl_floats = param->value.ui;
+ break;
+ case 'J':
+ jitter_val = param->value.i;
+ break;
+ case 'D':
+ always_deadline = param->value.ui;
+ break;
+ }
+ }
+
+ return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
+ capture_ports_midi, playback_ports_midi,
+ sample_rate, period_size,
+ listen_port, handle_transport_sync,
+ resample_factor, resample_factor_up, bitdepth,
+ use_autoconfig, latency, redundancy,
+ dont_htonl_floats, always_deadline, jitter_val);
}
void
driver_finish (jack_driver_t *driver)
{
- net_driver_delete ((net_driver_t *) driver);
+ net_driver_delete ((net_driver_t*)driver);
}