2 This file is part of PulseAudio.
4 PulseAudio is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published
6 by the Free Software Foundation; either version 2.1 of the License,
7 or (at your option) any later version.
9 PulseAudio is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public License
15 along with PulseAudio; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
27 #include <pulse/sample.h>
28 #include <pulse/volume.h>
29 #include <pulse/timeval.h>
31 #include <pulsecore/envelope.h>
32 #include <pulsecore/macro.h>
33 #include <pulsecore/endianmacros.h>
34 #include <pulsecore/memblock.h>
35 #include <pulsecore/sample-util.h>
37 #include <liboil/liboil.h>
39 const pa_envelope_def ramp_down
= {
41 .points_x
= { 100*PA_USEC_PER_MSEC
, 300*PA_USEC_PER_MSEC
},
44 .i
= { 0x10000, 0x10000/5 }
48 const pa_envelope_def ramp_up
= {
50 .points_x
= { 100*PA_USEC_PER_MSEC
, 300*PA_USEC_PER_MSEC
},
53 .i
= { 0x10000/5, 0x10000 }
57 const pa_envelope_def ramp_down2
= {
59 .points_x
= { 50*PA_USEC_PER_MSEC
, 900*PA_USEC_PER_MSEC
},
62 .i
= { 0x10000*4/5, 0x10000*7/10 }
66 const pa_envelope_def ramp_up2
= {
68 .points_x
= { 50*PA_USEC_PER_MSEC
, 900*PA_USEC_PER_MSEC
},
71 .i
= { 0x10000*7/10, 0x10000*9/10 }
75 static void dump_block(const pa_sample_spec
*ss
, const pa_memchunk
*chunk
) {
79 static unsigned j
= 0;
81 d
= pa_memblock_acquire(chunk
->memblock
);
87 case PA_SAMPLE_ALAW
: {
90 for (i
= 0; i
< chunk
->length
/ pa_frame_size(ss
); i
++)
91 printf("0x%02x ", *(u
++));
97 case PA_SAMPLE_S16RE
: {
100 for (i
= 0; i
< chunk
->length
/ pa_frame_size(ss
); i
++)
101 printf("%i\t%i\n", j
++, *(u
++));
106 case PA_SAMPLE_S32NE
:
107 case PA_SAMPLE_S32RE
: {
110 for (i
= 0; i
< chunk
->length
/ pa_frame_size(ss
); i
++)
111 printf("%i\t%i\n", j
++, *(u
++));
116 case PA_SAMPLE_FLOAT32NE
:
117 case PA_SAMPLE_FLOAT32RE
: {
120 for (i
= 0; i
< chunk
->length
/ pa_frame_size(ss
); i
++) {
121 printf("%i\t%1.3g\n", j
++, PA_MAYBE_FLOAT32_SWAP(ss
->format
== PA_SAMPLE_FLOAT32RE
, *u
));
129 pa_assert_not_reached();
134 pa_memblock_release(chunk
->memblock
);
137 static pa_memblock
* generate_block(pa_mempool
*pool
, const pa_sample_spec
*ss
) {
142 block
= pa_memblock_new(pool
, pa_bytes_per_second(ss
));
143 n_samples
= (unsigned) (pa_memblock_get_length(block
) / pa_sample_size(ss
));
145 d
= pa_memblock_acquire(block
);
147 switch (ss
->format
) {
149 case PA_SAMPLE_S16NE
:
150 case PA_SAMPLE_S16RE
: {
153 for (i
= d
; n_samples
> 0; n_samples
--, i
++)
159 case PA_SAMPLE_S32NE
:
160 case PA_SAMPLE_S32RE
: {
163 for (i
= d
; n_samples
> 0; n_samples
--, i
++)
169 case PA_SAMPLE_FLOAT32RE
:
170 case PA_SAMPLE_FLOAT32NE
: {
173 for (f
= d
; n_samples
> 0; n_samples
--, f
++)
174 *f
= PA_MAYBE_FLOAT32_SWAP(ss
->format
== PA_SAMPLE_FLOAT32RE
, 1.0f
);
180 pa_assert_not_reached();
183 pa_memblock_release(block
);
187 int main(int argc
, char *argv
[]) {
191 pa_envelope
*envelope
;
192 pa_envelope_item
*item1
, *item2
;
194 const pa_sample_spec ss
= {
195 .format
= PA_SAMPLE_S16NE
,
200 const pa_cvolume v
= {
202 .values
= { PA_VOLUME_NORM
, PA_VOLUME_NORM
/2 }
206 pa_log_set_level(PA_LOG_DEBUG
);
208 pa_assert_se(pool
= pa_mempool_new(FALSE
, 0));
209 pa_assert_se(envelope
= pa_envelope_new(&ss
));
211 block
= generate_block(pool
, &ss
);
213 chunk
.memblock
= pa_memblock_ref(block
);
214 chunk
.length
= pa_memblock_get_length(block
);
217 pa_volume_memchunk(&chunk
, &ss
, &v
);
219 item1
= pa_envelope_add(envelope
, &ramp_down
);
220 item2
= pa_envelope_add(envelope
, &ramp_down2
);
221 pa_envelope_apply(envelope
, &chunk
);
222 dump_block(&ss
, &chunk
);
224 pa_memblock_unref(chunk
.memblock
);
226 chunk
.memblock
= pa_memblock_ref(block
);
227 chunk
.length
= pa_memblock_get_length(block
);
230 item1
= pa_envelope_replace(envelope
, item1
, &ramp_up
);
231 item2
= pa_envelope_replace(envelope
, item2
, &ramp_up2
);
232 pa_envelope_apply(envelope
, &chunk
);
233 dump_block(&ss
, &chunk
);
235 pa_memblock_unref(chunk
.memblock
);
237 pa_envelope_remove(envelope
, item1
);
238 pa_envelope_remove(envelope
, item2
);
239 pa_envelope_free(envelope
);
241 pa_memblock_unref(block
);
243 pa_mempool_free(pool
);