owntone-server/src/player.h

231 lines
4.1 KiB
C
Raw Normal View History

2010-04-04 06:43:15 -04:00
#ifndef __PLAYER_H__
#define __PLAYER_H__
#include <stdint.h>
/* AirTunes v2 packet interval in ns */
/* (352 samples/packet * 1e9 ns/s) / 44100 samples/s = 7981859 ns/packet */
# define AIRTUNES_V2_STREAM_PERIOD 7981859
2010-04-04 06:43:15 -04:00
/* AirTunes v2 number of samples per packet */
#define AIRTUNES_V2_PACKET_SAMPLES 352
/* Samples to bytes, bytes to samples */
#define STOB(s) ((s) * 4)
#define BTOS(b) ((b) / 4)
/* Maximum number of previously played songs that are remembered */
#define MAX_HISTORY_COUNT 20
2010-04-04 06:43:15 -04:00
enum play_status {
PLAY_STOPPED = 2,
PLAY_PAUSED = 3,
PLAY_PLAYING = 4,
};
enum repeat_mode {
REPEAT_OFF = 0,
REPEAT_SONG = 1,
REPEAT_ALL = 2,
};
enum source_type {
SOURCE_FFMPEG = 0,
SOURCE_SPOTIFY,
SOURCE_PIPE,
};
struct spk_flags {
unsigned selected:1;
unsigned has_password:1;
2011-03-05 04:29:05 -05:00
unsigned has_video:1;
};
2010-04-04 06:43:15 -04:00
struct player_status {
enum play_status status;
enum repeat_mode repeat;
char shuffle;
int volume;
2014-12-21 14:41:44 -05:00
/* Playlist id */
uint32_t plid;
2014-12-21 14:41:44 -05:00
/* Playlist length */
uint32_t playlistlength;
/* Playing song id*/
2010-04-04 06:43:15 -04:00
uint32_t id;
2014-12-21 14:41:44 -05:00
/* Elapsed time in ms of playing song */
2010-04-04 06:43:15 -04:00
uint32_t pos_ms;
2014-12-21 14:41:44 -05:00
/* Song length in ms of playing song */
uint32_t songlength_ms;
/* Playlist position of playing song*/
2010-04-04 06:43:15 -04:00
int pos_pl;
2014-12-21 14:41:44 -05:00
/* Song id of next song in playlist */
uint32_t nextsong_id;
/* Playlist position of next song */
int nextsong_pos_pl;
2010-04-04 06:43:15 -04:00
};
typedef void (*spk_enum_cb)(uint64_t id, const char *name, int relvol, struct spk_flags flags, void *arg);
typedef void (*player_status_handler)(void);
2010-04-04 06:43:15 -04:00
struct player_source
{
uint32_t id;
2014-12-21 14:41:44 -05:00
uint32_t song_length;
enum source_type type;
int setup_done;
uint64_t stream_start;
uint64_t output_start;
uint64_t end;
struct transcode_ctx *ctx;
struct player_source *pl_next;
struct player_source *pl_prev;
struct player_source *shuffle_next;
struct player_source *shuffle_prev;
2010-04-04 06:43:15 -04:00
struct player_source *play_next;
};
2010-04-04 06:43:15 -04:00
2014-12-21 14:41:44 -05:00
struct player_queue
{
uint32_t playingid;
unsigned int length;
unsigned int start_pos;
unsigned int count;
uint32_t *queue;
};
struct player_history
{
/* Buffer index of the oldest remembered song */
unsigned int start_index;
/* Count of song ids in the buffer */
unsigned int count;
/* Circular buffer of song ids previously played by forked-daapd */
2014-05-03 13:44:26 -04:00
uint32_t id[MAX_HISTORY_COUNT];
};
2010-04-04 06:43:15 -04:00
int
player_get_current_pos(uint64_t *pos, struct timespec *ts, int commit);
int
player_get_status(struct player_status *status);
int
player_now_playing(uint32_t *id);
void
player_speaker_enumerate(spk_enum_cb cb, void *arg);
int
player_speaker_set(uint64_t *ids);
int
player_playback_start(uint32_t *idx_id);
2014-12-21 14:41:44 -05:00
int
player_playback_startpos(int pos, uint32_t *itemid);
int
player_playback_startid(uint32_t id, uint32_t *itemid);
2010-04-04 06:43:15 -04:00
int
player_playback_stop(void);
int
player_playback_pause(void);
int
player_playback_seek(int ms);
int
player_playback_next(void);
int
player_playback_prev(void);
int
player_volume_set(int vol);
int
player_volume_setrel_speaker(uint64_t id, int relvol);
int
player_volume_setabs_speaker(uint64_t id, int vol);
2010-04-04 06:43:15 -04:00
int
player_repeat_set(enum repeat_mode mode);
int
player_shuffle_set(int enable);
int
2013-11-22 10:41:57 -05:00
player_queue_make_daap(struct player_source **head, const char *query, const char *queuefilter, const char *sort, int quirk);
2010-04-04 06:43:15 -04:00
struct player_source *
player_queue_make_pl(int plid, uint32_t *id);
struct player_source *
2014-12-21 14:41:44 -05:00
player_queue_make_mpd(char *path, int recursive);
struct player_queue *
player_queue_get(int start_pos, int end_pos, char shuffle);
void
queue_free(struct player_queue *queue);
struct player_source *
next_ps(struct player_source *ps, char shuffle);
2010-04-04 06:43:15 -04:00
int
player_queue_add(struct player_source *ps);
int
player_queue_add_next(struct player_source *ps);
int
player_queue_move(int ps_pos_from, int ps_pos_to);
int
player_queue_remove(int ps_pos_remove);
2014-12-21 14:41:44 -05:00
int
player_queue_removeid(uint32_t id);
2010-04-04 06:43:15 -04:00
void
player_queue_clear(void);
void
player_queue_empty(int clear_hist);
void
player_queue_plid(uint32_t plid);
struct player_history *
player_history_get(void);
2010-04-04 06:43:15 -04:00
void
player_set_update_handler(player_status_handler handler);
2010-04-04 06:43:15 -04:00
int
player_init(void);
void
player_deinit(void);
#endif /* !__PLAYER_H__ */