#include #include #include //Header file for sleep(). man 3 sleep for details. #include #include #include #include /* Flags for the info decoder function. */ enum tags_select { TAGS_COMMENTS = 0x01, /* artist, title, etc. */ TAGS_TIME = 0x02 /* time of the file. */ }; enum moc_state { STOPPED, PLAYING, PAUSED }; enum moc_status { INITIALIZING, CONNECTED, FAILED_TO_CONNECT, ERROR, RECONNECTING }; /* One entry in the server's playlist or queue. A singly-linked list hangs * off struct moc's playlist/queue fields. */ struct moc_plist_item { char *file; char *title; char *artist; char *album; int track; int time; struct moc_plist_item *next; }; struct moc { pthread_mutex_t lock; enum moc_status status; enum moc_state state; char *filename; char *title; char *album; char *artist; int track; int time; int filled; int length; struct moc_plist_item *playlist; struct moc_plist_item *queue; /* The background thread owns the actual reads; sock/sock_lock let any * other thread send commands without racing/interleaving with it or with * the background thread's own internal requests. */ int sock; pthread_mutex_t sock_lock; }; extern const char * moc_str_status(enum moc_status s); extern const char * moc_str_state(enum moc_state s); extern struct moc * moc_init(); /* Commands a UI can call from any thread to control playback or modify the * playlist. Safe to call concurrently with each other and with the * background thread; each is a single atomic request to the server. */ extern void moc_play(struct moc *mh, const char *file); extern void moc_pause(struct moc *mh); extern void moc_unpause(struct moc *mh); extern void moc_stop(struct moc *mh); extern void moc_next(struct moc *mh); extern void moc_prev(struct moc *mh); extern void moc_playlist_add(struct moc *mh, const char *file); extern void moc_playlist_remove(struct moc *mh, const char *file); extern void moc_playlist_clear(struct moc *mh);