diff options
-rw-r--r-- | src/output/raop_output_plugin.c | 93 | ||||
-rw-r--r-- | src/output/raop_output_plugin.h | 98 |
2 files changed, 95 insertions, 96 deletions
diff --git a/src/output/raop_output_plugin.c b/src/output/raop_output_plugin.c index 735aea976..c82dd3c1a 100644 --- a/src/output/raop_output_plugin.c +++ b/src/output/raop_output_plugin.c @@ -21,11 +21,14 @@ #include "output_api.h" #include "mixer_list.h" #include "raop_output_plugin.h" +#include "ntp_server.h" #include "rtsp_client.h" #include "glib_compat.h" #include <glib.h> #include <unistd.h> +#include <sys/time.h> +#include <openssl/aes.h> #include <openssl/err.h> #include <openssl/rand.h> #include <openssl/rsa.h> @@ -40,6 +43,96 @@ #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "raop" +struct play_state { + bool playing; + unsigned short seq_num; + unsigned int rtptime; + unsigned int sync_src; + unsigned int start_rtptime; + struct timeval start_time; + struct timeval last_send; +}; + +/*********************************************************************/ + +enum pause_state { + NO_PAUSE = 0, + OP_PAUSE, + NODATA_PAUSE, +}; + +#define MINIMUM_SAMPLE_SIZE 32 + +#define RAOP_FD_READ (1<<0) +#define RAOP_FD_WRITE (1<<1) + +/*********************************************************************/ + +struct encrypt_data { + AES_KEY ctx; + unsigned char iv[16]; // initialization vector for aes-cbc + unsigned char nv[16]; // next vector for aes-cbc + unsigned char key[16]; // key for aes-cbc +}; + +/*********************************************************************/ + +struct raop_data { + struct rtspcl_data *rtspcl; + const char *addr; // target host address + short rtsp_port; + struct sockaddr_in ctrl_addr; + struct sockaddr_in data_addr; + + bool is_master; + struct raop_data *next; + + unsigned volume; + + GMutex *control_mutex; + + bool started; + bool paused; +}; + +/*********************************************************************/ + +struct control_data { + unsigned short port; + int fd; +}; + +/*********************************************************************/ + +#define NUMSAMPLES 352 +#define RAOP_BUFFER_SIZE NUMSAMPLES * 4 +#define RAOP_HEADER_SIZE 12 +#define ALAC_MAX_HEADER_SIZE 8 +#define RAOP_MAX_PACKET_SIZE RAOP_BUFFER_SIZE + RAOP_HEADER_SIZE + ALAC_MAX_HEADER_SIZE + +// session +struct raop_session_data { + struct raop_data *raop_list; + struct ntp_server ntp; + struct control_data ctrl; + struct encrypt_data encrypt; + struct play_state play_state; + + int data_fd; + + unsigned char buffer[RAOP_BUFFER_SIZE]; + size_t bufferSize; + + unsigned char data[RAOP_MAX_PACKET_SIZE]; + int wblk_wsize; + int wblk_remsize; + + GMutex *data_mutex; + GMutex *list_mutex; +}; + +/*********************************************************************/ + static struct raop_session_data *raop_session = NULL; /** diff --git a/src/output/raop_output_plugin.h b/src/output/raop_output_plugin.h index 210237179..bdc1e1a75 100644 --- a/src/output/raop_output_plugin.h +++ b/src/output/raop_output_plugin.h @@ -20,105 +20,11 @@ #ifndef MPD_OUTPUT_RAOP_PLUGIN_H #define MPD_OUTPUT_RAOP_PLUGIN_H -#include "ntp_server.h" -#include "rtsp_client.h" - #include <glib.h> -#include <stdbool.h> -#include <sys/time.h> -#include <openssl/aes.h> - -struct play_state { - bool playing; - unsigned short seq_num; - unsigned int rtptime; - unsigned int sync_src; - unsigned int start_rtptime; - struct timeval start_time; - struct timeval last_send; -}; - -/*********************************************************************/ - -enum pause_state { - NO_PAUSE = 0, - OP_PAUSE, - NODATA_PAUSE, -}; - -#define MINIMUM_SAMPLE_SIZE 32 - -#define RAOP_FD_READ (1<<0) -#define RAOP_FD_WRITE (1<<1) - -/*********************************************************************/ - -struct encrypt_data { - AES_KEY ctx; - unsigned char iv[16]; // initialization vector for aes-cbc - unsigned char nv[16]; // next vector for aes-cbc - unsigned char key[16]; // key for aes-cbc -}; - -/*********************************************************************/ - -struct raop_data { - struct rtspcl_data *rtspcl; - const char *addr; // target host address - short rtsp_port; - struct sockaddr_in ctrl_addr; - struct sockaddr_in data_addr; - - bool is_master; - struct raop_data *next; - - unsigned volume; - GMutex *control_mutex; - - bool started; - bool paused; -}; - -/*********************************************************************/ - -struct control_data { - unsigned short port; - int fd; -}; - -/*********************************************************************/ - -#define NUMSAMPLES 352 -#define RAOP_BUFFER_SIZE NUMSAMPLES * 4 -#define RAOP_HEADER_SIZE 12 -#define ALAC_MAX_HEADER_SIZE 8 -#define RAOP_MAX_PACKET_SIZE RAOP_BUFFER_SIZE + RAOP_HEADER_SIZE + ALAC_MAX_HEADER_SIZE - -// session -struct raop_session_data { - struct raop_data *raop_list; - struct ntp_server ntp; - struct control_data ctrl; - struct encrypt_data encrypt; - struct play_state play_state; - - int data_fd; - - unsigned char buffer[RAOP_BUFFER_SIZE]; - size_t bufferSize; - - unsigned char data[RAOP_MAX_PACKET_SIZE]; - int wblk_wsize; - int wblk_remsize; - - GMutex *data_mutex; - GMutex *list_mutex; -}; - -//static struct raop_session_data *raop_session; +#include <stdbool.h> -/*********************************************************************/ +struct raop_data; bool raop_set_volume(struct raop_data *rd, unsigned volume, GError **error_r); |