
/*
    Copyright (C) 2003 Robert Ham <rah@bash.sh>
    Copyright (C) 2005 Torben Hohn <torbenh@gmx.de>

    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.

    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.
*/

#ifndef __NETJACK_H__
#define __NETJACK_H__

#include <unistd.h>

#include <jack/types.h>
#include <jack/jack.h>
#include <jack/transport.h>
#include "jack/jslist.h"

#if HAVE_CELT
#include <celt/celt.h>
#endif

#if HAVE_OPUS
#include <opus/opus.h>
#include <opus/opus_custom.h>
#endif

#ifdef __cplusplus
extern "C"
{
#endif

    struct _packet_cache;

    typedef struct _netjack_driver_state netjack_driver_state_t;

    struct _netjack_driver_state {
        jack_nframes_t  net_period_up;
        jack_nframes_t  net_period_down;

        jack_nframes_t  sample_rate;
        jack_nframes_t  bitdepth;
        jack_nframes_t  period_size;
        jack_time_t	    period_usecs;
        int		    dont_htonl_floats;
        int		    always_deadline;

        jack_nframes_t  codec_latency;

        unsigned int    listen_port;

        unsigned int    capture_channels;
        unsigned int    playback_channels;
        unsigned int    capture_channels_audio;
        unsigned int    playback_channels_audio;
        unsigned int    capture_channels_midi;
        unsigned int    playback_channels_midi;

        JSList	    *capture_ports;
        JSList	    *playback_ports;
        JSList	    *playback_srcs;
        JSList	    *capture_srcs;

        jack_client_t   *client;

#ifdef WIN32
        SOCKET	    sockfd;
        SOCKET	    outsockfd;
#else
        int		    sockfd;
        int		    outsockfd;
#endif

        struct sockaddr_in syncsource_address;

        int		    reply_port;
        int		    srcaddress_valid;

        int sync_state;
        unsigned int handle_transport_sync;

        unsigned int *rx_buf;
        unsigned int rx_bufsize;
        //unsigned int tx_bufsize;
        unsigned int mtu;
        unsigned int latency;
        unsigned int redundancy;

        jack_nframes_t expected_framecnt;
        int		   expected_framecnt_valid;
        unsigned int   num_lost_packets;
        jack_time_t	   next_deadline;
        jack_time_t	   deadline_offset;
        int		   next_deadline_valid;
        int		   packet_data_valid;
        int		   resync_threshold;
        int		   running_free;
        int		   deadline_goodness;
        jack_time_t	   time_to_deadline;
        unsigned int   use_autoconfig;
        unsigned int   resample_factor;
        unsigned int   resample_factor_up;
        int		   jitter_val;
        struct _packet_cache * packcache;
#if HAVE_CELT
        CELTMode	   *celt_mode;
#endif
#if HAVE_OPUS
        OpusCustomMode* opus_mode;
#endif
    };
  
    int netjack_wait( netjack_driver_state_t *netj );
    void netjack_send_silence( netjack_driver_state_t *netj, int syncstate );
    void netjack_read( netjack_driver_state_t *netj, jack_nframes_t nframes ) ;
    void netjack_write( netjack_driver_state_t *netj, jack_nframes_t nframes, int syncstate );
    void netjack_attach( netjack_driver_state_t *netj );
    void netjack_detach( netjack_driver_state_t *netj );

    netjack_driver_state_t *netjack_init (netjack_driver_state_t *netj,
                                          jack_client_t * client,
                                          const 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,
                                          int dont_htonl_floats,
                                          int always_deadline,
                                          int jitter_val );

    void netjack_release( netjack_driver_state_t *netj );
    int netjack_startup( netjack_driver_state_t *netj );

#ifdef __cplusplus
}
#endif

#endif
