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"
26 typedef struct _MpdData_real
{
36 mpd_PlaylistFile
*playlist
;
38 mpd_OutputEntity
*output_dev
; /* from devices */
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
;
51 typedef struct _MpdQueue MpdQueue
;
52 typedef struct _MpdServerState
{
53 /* information needed to detect changes on mpd's side */
55 long long storedplaylistid
;
61 unsigned long dbUpdateTime
;
70 unsigned int samplerate
;
73 unsigned long playlistLength
;
81 /* internal use only */
82 typedef struct _MpdCommand
{
89 typedef struct _MpdObj
{
90 /* defines if we are connected */
91 /* This should be made true if and only if the connection is up and running */
93 /* information needed to connect to mpd */
97 float connection_timeout
;
99 /* mpd's structures */
100 mpd_Connection
*connection
;
103 mpd_Song
*CurrentSong
;
105 /* used to store/detect serverside status changes */
106 MpdServerState CurrentState
;
107 MpdServerState OldState
;
109 /* new style signals */
111 ErrorCallback the_error_callback
;
112 void *the_error_signal_userdata
;
113 /* song status changed */
114 StatusChangedCallback the_status_changed_callback
;
115 void *the_status_changed_signal_userdata
;
116 /* (dis)connect signal */
117 ConnectionChangedCallback the_connection_changed_callback
;
118 void *the_connection_changed_signal_userdata
;
125 /* internal values */
126 /* this "locks" the connections. so we can't have to commands competing with eachother */
127 short int connection_lock
;
132 /* TODO: this is a temporary implementation, I want something nice with commands that are and aren't allowed to use.
133 * so use commands and notcommands functions
134 *TODO: Make a callback when a commando isn't allowed, so the client application can actually offer the user to enter password
136 MpdCommand
* commands
;
138 * tag type for a search
144 * For tracking changed outputs.
145 * A hack for retarted mpd
150 * Supported url handlers
154 * For testing supported tags
156 int supported_tags
[MPD_TAG_NUM_OF_ITEM_TYPES
];
162 typedef enum MpdQueueType
{
166 MPD_QUEUE_DELETE_POS
,
167 MPD_QUEUE_COMMAND
/* abuse!!! */
170 typedef struct _MpdQueue
{
171 struct _MpdQueue
*next
;
172 struct _MpdQueue
*prev
;
173 struct _MpdQueue
*first
;
175 /* what item to queue, (add/load/remove)*/
177 /* for adding files/load playlist/adding streams */
183 /* Internal Queue struct functions */
184 MpdQueue
* mpd_new_queue_struct ();
185 void mpd_queue_get_next (MpdObj
*mi
);
187 /* Internal Data struct functions */
188 MpdData
* mpd_new_data_struct (void);
189 MpdData
* mpd_new_data_struct_append (MpdData
* data
);
190 MpdData
* mpd_data_concatenate (MpdData
* const first
, MpdData
* const second
);
191 MpdData
* mpd_data_get_next_real (MpdData
* const data
, int kill_list
);
192 /* more internal stuff*/
195 * @param mi a #MpdObj
197 * Checks if mpd_stats is available, and updates when needed.
199 * @returns a #MpdError
201 int mpd_stats_check(MpdObj
*mi
);
203 int mpd_lock_conn(MpdObj
*mi
);
204 int mpd_unlock_conn(MpdObj
*mi
);
205 /*MpdData * mpd_playlist_sort_artist_list(MpdData *data);*/
206 MpdData
* mpd_misc_sort_tag_list(MpdData
*data
);
210 char * strndup (const char *s
, size_t n
);
213 int mpd_server_get_allowed_commands(MpdObj
*mi
);
214 typedef enum _MpdSearchType
{
215 MPD_SEARCH_TYPE_NONE
,
216 MPD_SEARCH_TYPE_FIND
,
217 MPD_SEARCH_TYPE_SEARCH
,
218 MPD_SEARCH_TYPE_LIST
,
219 MPD_SEARCH_TYPE_PLAYLIST_FIND
,
220 MPD_SEARCH_TYPE_PLAYLIST_SEARCH
,
221 MPD_SEARCH_TYPE_STATS
223 int mpd_server_update_outputs(MpdObj
*mi
);