-
Notifications
You must be signed in to change notification settings - Fork 1
/
protocol.h
171 lines (155 loc) · 6.98 KB
/
protocol.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#ifndef PROTOCOL_H
#define PROTOCOL_H
#include "playlist.h"
struct event
{
int type; /* type of the event (one of EV_*) */
void *data; /* optional data associated with the event */
struct event *next;
};
struct event_queue
{
struct event *head;
struct event *tail;
};
/* Used as data field in the event queue for EV_FILE_TAGS. */
struct tag_ev_response
{
char *file;
struct file_tags *tags;
};
/* Used as data field in the event queue for EV_PLIST_MOVE. */
struct move_ev_data
{
/* Two files that are to be exchanged. */
char *from;
char *to;
};
/* Status of nonblock sending/receiving function. */
enum noblock_io_status
{
NB_IO_OK,
NB_IO_BLOCK,
NB_IO_ERR
};
/* Definition of events sent by server to the client. */
#define EV_STATE 0x01 /* server has changed the state */
#define EV_CTIME 0x02 /* current time of the song has changed */
#define EV_SRV_ERROR 0x04 /* an error occurred */
#define EV_BUSY 0x05 /* another client is connected to the server */
#define EV_DATA 0x06 /* data in response to a request will arrive */
#define EV_BITRATE 0x07 /* the bitrate has changed */
#define EV_RATE 0x08 /* the rate has changed */
#define EV_CHANNELS 0x09 /* the number of channels has changed */
#define EV_EXIT 0x0a /* the server is about to exit */
#define EV_PONG 0x0b /* response for CMD_PING */
#define EV_OPTIONS 0x0c /* the options has changed */
#define EV_SEND_PLIST 0x0d /* request for sending the playlist */
#define EV_TAGS 0x0e /* tags for the current file have changed */
#define EV_STATUS_MSG 0x0f /* followed by a status message */
#define EV_MIXER_CHANGE 0x10 /* the mixer channel was changed */
#define EV_FILE_TAGS 0x11 /* tags in a response for tags request */
#define EV_AVG_BITRATE 0x12 /* average bitrate has changed (new song) */
/* Events caused by a client that wants to modify the playlist (see
* CMD_CLI_PLIST* commands). */
#define EV_PLIST_ADD 0x50 /* add an item, followed by the file name */
#define EV_PLIST_DEL 0x51 /* delete an item, followed by the file name */
#define EV_PLIST_MOVE 0x52 /* move an item, followed by 2 file names */
#define EV_PLIST_CLEAR 0x53 /* clear the playlist */
/* These events, though similar to the four previous are caused by server
* which takes care of clients' queue synchronization. */
#define EV_QUEUE_ADD 0x54
#define EV_QUEUE_DEL 0x55
#define EV_QUEUE_MOVE 0x56
#define EV_QUEUE_CLEAR 0x57
/* State of the server. */
#define STATE_PLAY 0x01
#define STATE_STOP 0x02
#define STATE_PAUSE 0x03
/* Definition of server commands. */
#define CMD_PLAY 0x00 /* play the first element on the list */
#define CMD_LIST_CLEAR 0x01 /* clear the list */
#define CMD_LIST_ADD 0x02 /* add an item to the list */
#define CMD_STOP 0x04 /* stop playing */
#define CMD_PAUSE 0x05 /* pause */
#define CMD_UNPAUSE 0x06 /* unpause */
#define CMD_SET_OPTION 0x07 /* set an option */
#define CMD_GET_OPTION 0x08 /* get an option */
#define CMD_GET_CTIME 0x0d /* get the current song time */
#define CMD_GET_SNAME 0x0f /* get the stream file name */
#define CMD_NEXT 0x10 /* start playing next song if available */
#define CMD_QUIT 0x11 /* shutdown the server */
#define CMD_SEEK 0x12 /* seek in the current stream */
#define CMD_GET_STATE 0x13 /* get the state */
#define CMD_DISCONNECT 0x15 /* disconnect from the server */
#define CMD_GET_BITRATE 0x16 /* get the bitrate */
#define CMD_GET_RATE 0x17 /* get the rate */
#define CMD_GET_CHANNELS 0x18 /* get the number of channels */
#define CMD_PING 0x19 /* request for EV_PONG */
#define CMD_GET_MIXER 0x1a /* get the volume level */
#define CMD_SET_MIXER 0x1b /* set the volume level */
#define CMD_DELETE 0x1c /* delete an item from the playlist */
#define CMD_SEND_EVENTS 0x1d /* request for events */
#define CMD_GET_ERROR 0x1e /* get the error message */
#define CMD_PREV 0x20 /* start playing previous song if available */
#define CMD_SEND_PLIST 0x21 /* send the playlist to the requesting client */
#define CMD_GET_PLIST 0x22 /* get the playlist from one of the clients */
#define CMD_CAN_SEND_PLIST 0x23 /* mark the client as able to send
playlist */
#define CMD_CLI_PLIST_ADD 0x24 /* add an item to the client's playlist */
#define CMD_CLI_PLIST_DEL 0x25 /* delete an item from the client's
playlist */
#define CMD_CLI_PLIST_CLEAR 0x26 /* clear the client's playlist */
#define CMD_GET_SERIAL 0x27 /* get an unique serial number */
#define CMD_PLIST_SET_SERIAL 0x28 /* assign a serial number to the server's
playlist */
#define CMD_LOCK 0x29 /* acquire a lock */
#define CMD_UNLOCK 0x2a /* release the lock */
#define CMD_PLIST_GET_SERIAL 0x2b /* get the serial number of the server's
playlist */
#define CMD_GET_TAGS 0x2c /* get tags for the currently played file */
#define CMD_TOGGLE_MIXER_CHANNEL 0x2d /* toggle the mixer channel */
#define CMD_GET_MIXER_CHANNEL_NAME 0x2e /* get the mixer channel's name */
#define CMD_GET_FILE_TAGS 0x2f /* get tags for the specified file */
#define CMD_ABORT_TAGS_REQUESTS 0x30 /* abort previous CMD_GET_FILE_TAGS
requests up to some file */
#define CMD_CLI_PLIST_MOVE 0x31 /* move an item */
#define CMD_LIST_MOVE 0x32 /* move an item */
#define CMD_GET_AVG_BITRATE 0x33 /* get the average bitrate */
#define CMD_TOGGLE_SOFTMIXER 0x34 /* toggle use of softmixer */
#define CMD_TOGGLE_EQUALIZER 0x35 /* toggle use of equalizer */
#define CMD_EQUALIZER_REFRESH 0x36 /* refresh EQ-presets */
#define CMD_EQUALIZER_PREV 0x37 /* select previous eq-preset */
#define CMD_EQUALIZER_NEXT 0x38 /* select next eq-preset */
#define CMD_TOGGLE_MAKE_MONO 0x39 /* toggle mono mixing */
#define CMD_JUMP_TO 0x3a /* jumps to a some position in the current stream */
#define CMD_QUEUE_ADD 0x3b /* add an item to the queue */
#define CMD_QUEUE_DEL 0x3c /* delete an item from the queue */
#define CMD_QUEUE_MOVE 0x3d /* move an item in the queue */
#define CMD_QUEUE_CLEAR 0x3e /* clear the queue */
#define CMD_GET_QUEUE 0x3f /* request the queue from the server */
char *socket_name ();
int get_int (int sock, int *i);
enum noblock_io_status get_int_noblock (int sock, int *i);
int send_int (int sock, int i);
char *get_str (int sock);
int send_str (int sock, const char *str);
int get_time (int sock, time_t *i);
int send_time (int sock, time_t i);
int send_item (int sock, const struct plist_item *item);
struct plist_item *recv_item (int sock);
struct file_tags *recv_tags (int sock);
int send_tags (int sock, const struct file_tags *tags);
void event_queue_init (struct event_queue *q);
void event_queue_free (struct event_queue *q);
void free_event_data (const int type, void *data);
struct event *event_get_first (struct event_queue *q);
void event_pop (struct event_queue *q);
void event_push (struct event_queue *q, const int event, void *data);
int event_queue_empty (const struct event_queue *q);
enum noblock_io_status event_send_noblock (int sock, struct event_queue *q);
void free_tag_ev_data (struct tag_ev_response *d);
void free_move_ev_data (struct move_ev_data *m);
struct move_ev_data *move_ev_data_dup (const struct move_ev_data *m);
struct move_ev_data *recv_move_ev_data (int sock);
#endif