Update libtool version by 1 age (added functions)
[libmpd.git] / src / libmpd-internal.h
blobebea7cbe01194288041a125ca574c1a866c32c02
1 /* libmpd (high level libmpdclient library)
2 * Copyright (C) 2004-2009 Qball Cow <qball@sarine.nl>
3 * Project homepage: http://gmpcwiki.sarine.nl/
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #ifndef __MPD_INTERNAL_LIB_
21 #define __MPD_INTERNAL_LIB_
23 #include "libmpdclient.h"
24 struct _MpdData_real;
26 typedef struct _MpdData_real {
27 /* MpdDataType */
28 MpdDataType type;
30 union {
31 struct {
32 int tag_type;
33 char *tag;
35 char *directory;
36 mpd_PlaylistFile *playlist;
37 mpd_Song *song;
38 mpd_OutputEntity *output_dev; /* from devices */
40 void *userdata;
41 void (*freefunc)(void *userdata);
43 struct _MpdData_real *next;
44 /* Previous MpdData in the list */
45 struct _MpdData_real *prev;
46 struct _MpdData_real *first;
47 }MpdData_real;
50 /* queue struct */
51 typedef struct _MpdQueue MpdQueue;
52 typedef struct _MpdServerState {
53 /* information needed to detect changes on mpd's side */
54 long long playlistid;
55 long long storedplaylistid;
56 int songid;
57 int songpos;
58 int nextsongpos;
59 int nextsongid;
60 int state;
61 unsigned long dbUpdateTime;
62 int updatingDb;
63 int random;
64 int repeat;
65 int volume;
66 int xfade;
67 int totaltime;
68 int elapsedtime;
69 int bitrate;
70 unsigned int samplerate;
71 int bits;
72 int channels;
73 unsigned long playlistLength;
74 char error[512];
75 } MpdServerState;
78 /* command struct */
79 /* internal use only */
80 typedef struct _MpdCommand {
81 char *command_name;
82 int enabled;
83 } MpdCommand;
87 typedef struct _MpdObj {
88 /* defines if we are connected */
89 /* This should be made true if and only if the connection is up and running */
90 short int connected;
91 /* information needed to connect to mpd */
92 char *hostname;
93 int port;
94 char *password;
95 float connection_timeout;
97 /* mpd's structures */
98 mpd_Connection *connection;
99 mpd_Status *status;
100 mpd_Stats *stats;
101 mpd_Song *CurrentSong;
103 /* used to store/detect serverside status changes */
104 MpdServerState CurrentState;
105 MpdServerState OldState;
107 /* new style signals */
108 /* error signal */
109 ErrorCallback the_error_callback;
110 void *the_error_signal_userdata;
111 /* song status changed */
112 StatusChangedCallback the_status_changed_callback;
113 void *the_status_changed_signal_userdata;
114 /* (dis)connect signal */
115 ConnectionChangedCallback the_connection_changed_callback;
116 void *the_connection_changed_signal_userdata;
118 /* error message */
119 int error;
120 int error_mpd_code;
121 char *error_msg;
123 /* internal values */
124 /* this "locks" the connections. so we can't have to commands competing with eachother */
125 short int connection_lock;
127 /* queue */
128 MpdQueue *queue;
129 /* commands */
130 /* TODO: this is a temporary implementation, I want something nice with commands that are and aren't allowed to use.
131 * so use commands and notcommands functions
132 *TODO: Make a callback when a commando isn't allowed, so the client application can actually offer the user to enter password
134 MpdCommand * commands;
136 * tag type for a search
138 int search_type;
139 int search_field;
142 * For tracking changed outputs.
143 * A hack for retarted mpd
145 int num_outputs;
146 int *output_states;
149 * For testing supported tags
151 int supported_tags[MPD_TAG_NUM_OF_ITEM_TYPES];
153 int has_idle;
154 }_MpdObj;
157 typedef enum MpdQueueType {
158 MPD_QUEUE_ADD,
159 MPD_QUEUE_LOAD,
160 MPD_QUEUE_DELETE_ID,
161 MPD_QUEUE_DELETE_POS,
162 MPD_QUEUE_COMMAND /* abuse!!! */
163 } MpdQueueType;
165 typedef struct _MpdQueue {
166 struct _MpdQueue *next;
167 struct _MpdQueue *prev;
168 struct _MpdQueue *first;
170 /* what item to queue, (add/load/remove)*/
171 int type;
172 /* for adding files/load playlist/adding streams */
173 char *path;
174 /* for removing */
175 int id;
176 }_MpdQueue;
178 /* Internal Queue struct functions */
179 MpdQueue * mpd_new_queue_struct ();
180 void mpd_queue_get_next (MpdObj *mi);
182 /* Internal Data struct functions */
183 MpdData * mpd_new_data_struct (void);
184 MpdData * mpd_new_data_struct_append (MpdData * data);
185 MpdData * mpd_data_concatenate (MpdData * const first, MpdData * const second);
186 MpdData * mpd_data_get_next_real (MpdData * const data, int kill_list);
187 /* more internal stuff*/
190 * @param mi a #MpdObj
192 * Checks if mpd_stats is available, and updates when needed.
194 * @returns a #MpdError
196 int mpd_stats_check(MpdObj *mi);
198 int mpd_lock_conn(MpdObj *mi);
199 int mpd_unlock_conn(MpdObj *mi);
200 /*MpdData * mpd_playlist_sort_artist_list(MpdData *data);*/
201 MpdData * mpd_misc_sort_tag_list(MpdData *data);
204 #ifndef HAVE_STRNDUP
205 char * strndup (const char *s, size_t n);
206 #endif
208 int mpd_server_get_allowed_commands(MpdObj *mi);
209 typedef enum _MpdSearchType {
210 MPD_SEARCH_TYPE_NONE,
211 MPD_SEARCH_TYPE_FIND,
212 MPD_SEARCH_TYPE_SEARCH,
213 MPD_SEARCH_TYPE_LIST,
214 MPD_SEARCH_TYPE_PLAYLIST_FIND,
215 MPD_SEARCH_TYPE_PLAYLIST_SEARCH,
216 MPD_SEARCH_TYPE_STATS
217 }MpdSearchType;
218 int mpd_server_update_outputs(MpdObj *mi);
219 #endif