configure.ac: Don't allow UNIX IPC to be configured for a native Windows build.
[mpd-mk.git] / src / pcm_resample_fallback.c
blob0c75d8ba4821926b70efe3e72623865e2788d33c
1 /*
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.
20 #include "config.h"
21 #include "pcm_resample_internal.h"
23 #include <assert.h>
25 void
26 pcm_resample_fallback_deinit(struct pcm_resample_state *state)
28 pcm_buffer_deinit(&state->buffer);
31 /* resampling code blatantly ripped from ESD */
32 const int16_t *
33 pcm_resample_fallback_16(struct pcm_resample_state *state,
34 uint8_t channels,
35 unsigned src_rate,
36 const int16_t *src_buffer, size_t src_size,
37 unsigned dest_rate,
38 size_t *dest_size_r)
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);
50 switch (channels) {
51 case 1:
52 while (dest_pos < dest_samples) {
53 src_pos = dest_pos * src_rate / dest_rate;
55 dest_buffer[dest_pos++] = src_buffer[src_pos];
57 break;
58 case 2:
59 while (dest_pos < dest_samples) {
60 src_pos = dest_pos * src_rate / dest_rate;
61 src_pos &= ~1;
63 dest_buffer[dest_pos++] = src_buffer[src_pos];
64 dest_buffer[dest_pos++] = src_buffer[src_pos + 1];
66 break;
69 *dest_size_r = dest_size;
70 return dest_buffer;
73 const int32_t *
74 pcm_resample_fallback_32(struct pcm_resample_state *state,
75 uint8_t channels,
76 unsigned src_rate,
77 const int32_t *src_buffer, size_t src_size,
78 unsigned dest_rate,
79 size_t *dest_size_r)
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);
91 switch (channels) {
92 case 1:
93 while (dest_pos < dest_samples) {
94 src_pos = dest_pos * src_rate / dest_rate;
96 dest_buffer[dest_pos++] = src_buffer[src_pos];
98 break;
99 case 2:
100 while (dest_pos < dest_samples) {
101 src_pos = dest_pos * src_rate / dest_rate;
102 src_pos &= ~1;
104 dest_buffer[dest_pos++] = src_buffer[src_pos];
105 dest_buffer[dest_pos++] = src_buffer[src_pos + 1];
107 break;
110 *dest_size_r = dest_size;
111 return dest_buffer;