#pragma once #include #include #include #include #include #include "../util/queue.h" #include "../liana/client.h" #include "../buffer/clock.h" #include "../buffer/audio.h" #ifndef CAMU_SINK_NO_VIDEO #include "../buffer/video.h" #else // Stub video_buffer usage within libsink only. #include "../buffer/video_null.h" #endif enum { CAMU_SINK_AUDIO = 0, CAMU_SINK_VIDEO }; enum { CAMU_SINK_ADD_BUFFER = 0, CAMU_SINK_REMOVE_BUFFER, CAMU_SINK_START, CAMU_SINK_STOP, CAMU_SINK_REFRESH_VIDEO, CAMU_SINK_CLEAR, CAMU_SINK_MOCK_CLOSE, CAMU_SINK_EXIT }; enum { CAMU_SINK_OK = 0 }; enum { CAMU_SEEK_POS = 0, CAMU_SEEK_RELATIVE, CAMU_SEEK_PERCENT }; struct camu_sink_entry { struct lia_client client; u64 id; s32 sequence; u16 lru; bool disconnected; bool ended; u32 reset_token; struct camu_clock clock; bool paused; struct { u8 state; // Don't stop audio on a BUFFER_PAUSED from this entry. bool ignore_paused; struct camu_audio_buffer buf; struct lia_vcr_track *track; } audio; struct { u8 state; struct camu_video_buffer buf; struct lia_vcr_track *track; } video; struct camu_sink *sink; }; struct camu_sink_cmd { u8 op; union { s64 i; u64 u; f64 f; } v; void *opaque; }; struct camu_sink { struct nn_event_loop *loop; str name; u8 type; str addr; u16 port; struct nn_rpc client; struct nn_rpc_connection *conn; bool connected; u16 connection_number; bool local; struct nn_mutex lock; struct nn_timer reconnect_timer; struct nn_signal queue_signal; queue(struct camu_sink_cmd) queue; struct camu_sink_entry *current; struct camu_sink_entry *target; // If current was removed for a reconnect, it's "suspended". struct camu_sink_entry *suspended; array(struct camu_sink_entry *) previous; array(struct camu_sink_entry *) entries; u16 lru; struct { u8 state; struct camu_mixer *mixer; } audio; struct { u8 state; struct camu_renderer *renderer; } video; struct lia_prefs prefs; str default_list; u8 (*callback)(void *, u8, u8, void *); void *userdata; }; bool camu_sink_init(struct camu_sink *sink, struct nn_event_loop *loop, struct camu_mixer *mixer, struct camu_renderer *renderer); bool camu_sink_connect(struct camu_sink *sink, str *name, u8 type, str *addr, u16 port); struct camu_sink_entry *camu_sink_get_current(struct camu_sink *sink); void camu_sink_return_current(struct camu_sink *sink); void camu_sink_skip(struct camu_sink *sink, s32 n); void camu_sink_toggle_pause(struct camu_sink *sink); void camu_sink_seek(struct camu_sink *sink, void *value, u8 mode); void camu_sink_reseek(struct camu_sink *sink); void camu_sink_shuffle(struct camu_sink *sink); void camu_sink_stop(struct camu_sink *sink); void camu_sink_close(struct camu_sink *sink); void camu_sink_free(struct camu_sink *sink);