2 * Copyright (C) 2003-2010 The Music Player Daemon Project
3 * http://www.musicpd.org
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "pcm_resample_internal.h"
26 pcm_resample_fallback_deinit(struct pcm_resample_state
*state
)
28 pcm_buffer_deinit(&state
->buffer
);
31 /* resampling code blatantly ripped from ESD */
33 pcm_resample_fallback_16(struct pcm_resample_state
*state
,
36 const int16_t *src_buffer
, size_t src_size
,
40 unsigned src_pos
, dest_pos
= 0;
41 unsigned src_frames
= src_size
/ channels
/ sizeof(*src_buffer
);
42 unsigned dest_frames
=
43 (src_frames
* dest_rate
+ src_rate
- 1) / src_rate
;
44 unsigned dest_samples
= dest_frames
* channels
;
45 size_t dest_size
= dest_samples
* sizeof(*src_buffer
);
46 int16_t *dest_buffer
= pcm_buffer_get(&state
->buffer
, dest_size
);
48 assert((src_size
% (sizeof(*src_buffer
) * channels
)) == 0);
52 while (dest_pos
< dest_samples
) {
53 src_pos
= dest_pos
* src_rate
/ dest_rate
;
55 dest_buffer
[dest_pos
++] = src_buffer
[src_pos
];
59 while (dest_pos
< dest_samples
) {
60 src_pos
= dest_pos
* src_rate
/ dest_rate
;
63 dest_buffer
[dest_pos
++] = src_buffer
[src_pos
];
64 dest_buffer
[dest_pos
++] = src_buffer
[src_pos
+ 1];
69 *dest_size_r
= dest_size
;
74 pcm_resample_fallback_32(struct pcm_resample_state
*state
,
77 const int32_t *src_buffer
, size_t src_size
,
81 unsigned src_pos
, dest_pos
= 0;
82 unsigned src_frames
= src_size
/ channels
/ sizeof(*src_buffer
);
83 unsigned dest_frames
=
84 (src_frames
* dest_rate
+ src_rate
- 1) / src_rate
;
85 unsigned dest_samples
= dest_frames
* channels
;
86 size_t dest_size
= dest_samples
* sizeof(*src_buffer
);
87 int32_t *dest_buffer
= pcm_buffer_get(&state
->buffer
, dest_size
);
89 assert((src_size
% (sizeof(*src_buffer
) * channels
)) == 0);
93 while (dest_pos
< dest_samples
) {
94 src_pos
= dest_pos
* src_rate
/ dest_rate
;
96 dest_buffer
[dest_pos
++] = src_buffer
[src_pos
];
100 while (dest_pos
< dest_samples
) {
101 src_pos
= dest_pos
* src_rate
/ dest_rate
;
104 dest_buffer
[dest_pos
++] = src_buffer
[src_pos
];
105 dest_buffer
[dest_pos
++] = src_buffer
[src_pos
+ 1];
110 *dest_size_r
= dest_size
;