~binli/ubuntu/vivid/pulseaudio/fix-atoi

« back to all changes in this revision

Viewing changes to .pc/0306-resampler-Make-some-basic-functions-for-rewinding.patch/src/pulsecore/resampler.h

  • Committer: Bin Li
  • Date: 2016-07-05 03:39:49 UTC
  • Revision ID: bin.li@canonical.com-20160705033949-rz4p9x4hbi2danxk
first version based on pulseaudio_6.0-0ubuntu9.27

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef fooresamplerhfoo
 
2
#define fooresamplerhfoo
 
3
 
 
4
/***
 
5
  This file is part of PulseAudio.
 
6
 
 
7
  Copyright 2004-2006 Lennart Poettering
 
8
 
 
9
  PulseAudio is free software; you can redistribute it and/or modify
 
10
  it under the terms of the GNU Lesser General Public License as published
 
11
  by the Free Software Foundation; either version 2.1 of the License,
 
12
  or (at your option) any later version.
 
13
 
 
14
  PulseAudio is distributed in the hope that it will be useful, but
 
15
  WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 
17
  General Public License for more details.
 
18
 
 
19
  You should have received a copy of the GNU Lesser General Public License
 
20
  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 
21
***/
 
22
 
 
23
#include <pulse/sample.h>
 
24
#include <pulse/channelmap.h>
 
25
#include <pulsecore/memblock.h>
 
26
#include <pulsecore/memchunk.h>
 
27
#include <pulsecore/sconv.h>
 
28
#include <pulsecore/remap.h>
 
29
#include <pulsecore/filter/lfe-filter.h>
 
30
 
 
31
typedef struct pa_resampler pa_resampler;
 
32
typedef struct pa_resampler_impl pa_resampler_impl;
 
33
 
 
34
struct pa_resampler_impl {
 
35
    void (*free)(pa_resampler *r);
 
36
    void (*update_rates)(pa_resampler *r);
 
37
 
 
38
    /* Returns the number of leftover frames in the input buffer. */
 
39
    unsigned (*resample)(pa_resampler *r, const pa_memchunk *in, unsigned in_n_frames, pa_memchunk *out, unsigned *out_n_frames);
 
40
 
 
41
    void (*reset)(pa_resampler *r);
 
42
    void *data;
 
43
};
 
44
 
 
45
typedef enum pa_resample_method {
 
46
    PA_RESAMPLER_INVALID                 = -1,
 
47
    PA_RESAMPLER_SRC_SINC_BEST_QUALITY   = 0, /* = SRC_SINC_BEST_QUALITY */
 
48
    PA_RESAMPLER_SRC_SINC_MEDIUM_QUALITY = 1, /* = SRC_SINC_MEDIUM_QUALITY */
 
49
    PA_RESAMPLER_SRC_SINC_FASTEST        = 2, /* = SRC_SINC_FASTEST */
 
50
    PA_RESAMPLER_SRC_ZERO_ORDER_HOLD     = 3, /* = SRC_ZERO_ORDER_HOLD */
 
51
    PA_RESAMPLER_SRC_LINEAR              = 4, /* = SRC_LINEAR */
 
52
    PA_RESAMPLER_TRIVIAL,
 
53
    PA_RESAMPLER_SPEEX_FLOAT_BASE,
 
54
    PA_RESAMPLER_SPEEX_FLOAT_MAX = PA_RESAMPLER_SPEEX_FLOAT_BASE + 10,
 
55
    PA_RESAMPLER_SPEEX_FIXED_BASE,
 
56
    PA_RESAMPLER_SPEEX_FIXED_MAX = PA_RESAMPLER_SPEEX_FIXED_BASE + 10,
 
57
    PA_RESAMPLER_FFMPEG,
 
58
    PA_RESAMPLER_AUTO, /* automatic select based on sample format */
 
59
    PA_RESAMPLER_COPY,
 
60
    PA_RESAMPLER_PEAKS,
 
61
    PA_RESAMPLER_MAX
 
62
} pa_resample_method_t;
 
63
 
 
64
typedef enum pa_resample_flags {
 
65
    PA_RESAMPLER_VARIABLE_RATE = 0x0001U,
 
66
    PA_RESAMPLER_NO_REMAP      = 0x0002U,  /* implies NO_REMIX */
 
67
    PA_RESAMPLER_NO_REMIX      = 0x0004U,
 
68
    PA_RESAMPLER_NO_LFE        = 0x0008U
 
69
} pa_resample_flags_t;
 
70
 
 
71
struct pa_resampler {
 
72
    pa_resample_method_t method;
 
73
    pa_resample_flags_t flags;
 
74
 
 
75
    pa_sample_spec i_ss, o_ss;
 
76
    pa_channel_map i_cm, o_cm;
 
77
    size_t i_fz, o_fz, w_fz, w_sz;
 
78
    pa_mempool *mempool;
 
79
 
 
80
    pa_memchunk to_work_format_buf;
 
81
    pa_memchunk remap_buf;
 
82
    pa_memchunk resample_buf;
 
83
    pa_memchunk from_work_format_buf;
 
84
    size_t to_work_format_buf_size;
 
85
    size_t remap_buf_size;
 
86
    size_t resample_buf_size;
 
87
    size_t from_work_format_buf_size;
 
88
 
 
89
    /* points to buffer before resampling stage, remap or to_work */
 
90
    pa_memchunk *leftover_buf;
 
91
    size_t *leftover_buf_size;
 
92
 
 
93
    /* have_leftover points to leftover_in_remap or leftover_in_to_work */
 
94
    bool *have_leftover;
 
95
    bool leftover_in_remap;
 
96
    bool leftover_in_to_work;
 
97
 
 
98
    pa_sample_format_t work_format;
 
99
    uint8_t work_channels;
 
100
 
 
101
    pa_convert_func_t to_work_format_func;
 
102
    pa_convert_func_t from_work_format_func;
 
103
 
 
104
    pa_remap_t remap;
 
105
    bool map_required;
 
106
 
 
107
    pa_lfe_filter_t *lfe_filter;
 
108
 
 
109
    pa_resampler_impl impl;
 
110
};
 
111
 
 
112
pa_resampler* pa_resampler_new(
 
113
        pa_mempool *pool,
 
114
        const pa_sample_spec *a,
 
115
        const pa_channel_map *am,
 
116
        const pa_sample_spec *b,
 
117
        const pa_channel_map *bm,
 
118
        unsigned crossover_freq,
 
119
        pa_resample_method_t resample_method,
 
120
        pa_resample_flags_t flags);
 
121
 
 
122
void pa_resampler_free(pa_resampler *r);
 
123
 
 
124
/* Returns the size of an input memory block which is required to return the specified amount of output data */
 
125
size_t pa_resampler_request(pa_resampler *r, size_t out_length);
 
126
 
 
127
/* Inverse of pa_resampler_request() */
 
128
size_t pa_resampler_result(pa_resampler *r, size_t in_length);
 
129
 
 
130
/* Returns the maximum size of input blocks we can process without needing bounce buffers larger than the mempool tile size. */
 
131
size_t pa_resampler_max_block_size(pa_resampler *r);
 
132
 
 
133
/* Pass the specified memory chunk to the resampler and return the newly resampled data */
 
134
void pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out);
 
135
 
 
136
/* Change the input rate of the resampler object */
 
137
void pa_resampler_set_input_rate(pa_resampler *r, uint32_t rate);
 
138
 
 
139
/* Change the output rate of the resampler object */
 
140
void pa_resampler_set_output_rate(pa_resampler *r, uint32_t rate);
 
141
 
 
142
/* Reinitialize state of the resampler, possibly due to seeking or other discontinuities */
 
143
void pa_resampler_reset(pa_resampler *r);
 
144
 
 
145
/* Return the resampling method of the resampler object */
 
146
pa_resample_method_t pa_resampler_get_method(pa_resampler *r);
 
147
 
 
148
/* Try to parse the resampler method */
 
149
pa_resample_method_t pa_parse_resample_method(const char *string);
 
150
 
 
151
/* return a human readable string for the specified resampling method. Inverse of pa_parse_resample_method() */
 
152
const char *pa_resample_method_to_string(pa_resample_method_t m);
 
153
 
 
154
/* Return 1 when the specified resampling method is supported */
 
155
int pa_resample_method_supported(pa_resample_method_t m);
 
156
 
 
157
const pa_channel_map* pa_resampler_input_channel_map(pa_resampler *r);
 
158
const pa_sample_spec* pa_resampler_input_sample_spec(pa_resampler *r);
 
159
const pa_channel_map* pa_resampler_output_channel_map(pa_resampler *r);
 
160
const pa_sample_spec* pa_resampler_output_sample_spec(pa_resampler *r);
 
161
 
 
162
/* Implementation specific init functions */
 
163
int pa_resampler_ffmpeg_init(pa_resampler *r);
 
164
int pa_resampler_libsamplerate_init(pa_resampler *r);
 
165
int pa_resampler_peaks_init(pa_resampler *r);
 
166
int pa_resampler_speex_init(pa_resampler *r);
 
167
int pa_resampler_trivial_init(pa_resampler*r);
 
168
 
 
169
/* Resampler-specific quirks */
 
170
bool pa_speex_is_fixed_point(void);
 
171
 
 
172
#endif