summaryrefslogtreecommitdiff
path: root/src/libsink/sink.h
blob: acb6a514e4db103ff1e46fd7b51bc2ff56e43a9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#pragma once

#include <al/str.h>
#include <al/array.h>
#include <nnwt/rpc2.h>
#include <nnwt/signal.h>
#include <nnwt/timer.h>

#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);