summaryrefslogtreecommitdiffstats
path: root/audio/filter/af.h
blob: 9c49081f66632d98488d76768f4e34244ca2d00a (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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 * This file is part of mpv.
 *
 * mpv is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * mpv is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with mpv.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef MPLAYER_AF_H
#define MPLAYER_AF_H

#include <stdio.h>
#include <stdbool.h>
#include <sys/types.h>

#include "options/options.h"
#include "audio/format.h"
#include "audio/chmap.h"
#include "audio/audio.h"
#include "common/msg.h"
#include "common/common.h"

struct af_instance;
struct mpv_global;

// Number of channels
#define AF_NCH MP_NUM_CHANNELS

// Flags for af->filter()
#define AF_FILTER_FLAG_EOF 1

/* Audio filter information not specific for current instance, but for
   a specific filter */
struct af_info {
    const char *info;
    const char *name;
    int (*open)(struct af_instance *vf);
    int priv_size;
    const void *priv_defaults;
    const struct m_option *options;
};

// Linked list of audio filters
struct af_instance {
    const struct af_info *info;
    struct mp_log *log;
    struct MPOpts *opts;
    struct replaygain_data *replaygain_data;
    int (*control)(struct af_instance *af, int cmd, void *arg);
    void (*uninit)(struct af_instance *af);
    /* Feed a frame. The frame is NULL if EOF was reached, and the filter
     * should drain all remaining buffered data.
     * Use af_add_output_frame() to output data. The optional filter_out
     * callback can be set to produce output frames gradually.
     */
    int (*filter_frame)(struct af_instance *af, struct mp_audio *frame);
    int (*filter_out)(struct af_instance *af);
    void *priv;
    struct mp_audio *data; // configuration and buffer for outgoing data stream

    struct af_instance *next;
    struct af_instance *prev;
    double delay; /* Delay caused by the filter, in seconds of audio consumed
                   * without corresponding output */
    bool auto_inserted; // inserted by af.c, such as conversion filters
    char *label;

    struct mp_audio fmt_in, fmt_out;

    struct mp_audio **out_queued;
    int num_out_queued;

    struct mp_audio_pool *out_pool;
};

// Current audio stream
struct af_stream {
    int initialized; // 0: no, 1: yes, -1: attempted to, but failed

    // The first and last filter in the list
    struct af_instance *first;
    struct af_instance *last;
    // The user sets the input format (what the decoder outputs), and sets some
    // or all fields in output to the output format the AO accepts.
    struct mp_audio input;
    struct mp_audio output;
    struct mp_audio filter_output;

    struct mp_log *log;
    struct MPOpts *opts;
    struct replaygain_data *replaygain_data;
};

// Return values
#define AF_DETACH   (CONTROL_OK + 1)
#define AF_OK       CONTROL_OK
#define AF_TRUE     CONTROL_TRUE
#define AF_FALSE    CONTROL_FALSE
#define AF_UNKNOWN  CONTROL_UNKNOWN
#define AF_ERROR    CONTROL_ERROR

// Parameters for af_control_*
enum af_control {
    AF_CONTROL_REINIT = 1,
    AF_CONTROL_RESET,
    AF_CONTROL_SET_RESAMPLE_RATE,
    AF_CONTROL_SET_FORMAT,
    AF_CONTROL_SET_CHANNELS,
    AF_CONTROL_SET_VOLUME,
    AF_CONTROL_GET_VOLUME,
    AF_CONTROL_SET_PAN_LEVEL,
    AF_CONTROL_SET_PAN_NOUT,
    AF_CONTROL_SET_PAN_BALANCE,
    AF_CONTROL_GET_PAN_BALANCE,
    AF_CONTROL_SET_PLAYBACK_SPEED,
    AF_CONTROL_SET_PLAYBACK_SPEED_RESAMPLE,
    AF_CONTROL_GET_METADATA,
    AF_CONTROL_COMMAND,
};

// Argument for AF_CONTROL_SET_PAN_LEVEL
typedef struct af_control_ext_s {
    void* arg;  // Argument
    int ch;     // Chanel number
} af_control_ext_t;

struct af_stream *af_new(struct mpv_global *global);
void af_destroy(struct af_stream *s);
int af_init(struct af_stream *s);
void af_uninit(struct af_stream *s);
struct af_instance *af_add(struct af_stream *s, char *name, char *label,
                           char **args);
int af_remove_by_label(struct af_stream *s, char *label);
struct af_instance *af_find_by_label(struct af_stream *s, char *label);
struct af_instance *af_control_any_rev(struct af_stream *s, int cmd, void *arg);
void af_control_all(struct af_stream *s, int cmd, void *arg);
int af_control_by_label(struct af_stream *s, int cmd, void *arg, bstr label);
void af_seek_reset(struct af_stream *s);
int af_send_command(struct af_stream *s, char *label, char *cmd, char *arg);

void af_add_output_frame(struct af_instance *af, struct mp_audio *frame);
int af_filter_frame(struct af_stream *s, struct mp_audio *frame);
int af_output_frame(struct af_stream *s, bool eof);
struct mp_audio *af_read_output_frame(struct af_stream *s);
int af_make_writeable(struct af_instance *af, struct mp_audio *frame);

double af_calc_delay(struct af_stream *s);

int af_test_output(struct af_instance *af, struct mp_audio *out);

int af_from_ms(int n, float *in, int *out, int rate, float mi, float ma);
float af_softclip(float a);

bool af_lavrresample_test_conversion(int src_format, int dst_format);

#endif /* MPLAYER_AF_H */