5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package com.sun.media.sound;
26
27 /**
28 * A resampler that uses first-order (linear) interpolation.
29 *
30 * @author Karl Helgason
31 */
32 public final class SoftLinearResampler extends SoftAbstractResampler {
33
34 public int getPadding() {
35 return 2;
36 }
37
38 public void interpolate(float[] in, float[] in_offset, float in_end,
39 float[] startpitch, float pitchstep, float[] out, int[] out_offset,
40 int out_end) {
41
42 float pitch = startpitch[0];
43 float ix = in_offset[0];
44 int ox = out_offset[0];
45 float ix_end = in_end;
46 int ox_end = out_end;
47 if (pitchstep == 0f) {
48 while (ix < ix_end && ox < ox_end) {
49 int iix = (int) ix;
50 float fix = ix - iix;
51 float i = in[iix];
52 out[ox++] = i + (in[iix + 1] - i) * fix;
53 ix += pitch;
54 }
55 } else {
56 while (ix < ix_end && ox < ox_end) {
57 int iix = (int) ix;
58 float fix = ix - iix;
59 float i = in[iix];
60 out[ox++] = i + (in[iix + 1] - i) * fix;
61 ix += pitch;
62 pitch += pitchstep;
63 }
64 }
65 in_offset[0] = ix;
66 out_offset[0] = ox;
67 startpitch[0] = pitch;
68
69 }
70 }
|
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.media.sound;
27
28 /**
29 * A resampler that uses first-order (linear) interpolation.
30 *
31 * @author Karl Helgason
32 */
33 public final class SoftLinearResampler extends SoftAbstractResampler {
34
35 @Override
36 public int getPadding() {
37 return 2;
38 }
39
40 @Override
41 public void interpolate(float[] in, float[] in_offset, float in_end,
42 float[] startpitch, float pitchstep, float[] out, int[] out_offset,
43 int out_end) {
44
45 float pitch = startpitch[0];
46 float ix = in_offset[0];
47 int ox = out_offset[0];
48 float ix_end = in_end;
49 int ox_end = out_end;
50 if (pitchstep == 0f) {
51 while (ix < ix_end && ox < ox_end) {
52 int iix = (int) ix;
53 float fix = ix - iix;
54 float i = in[iix];
55 out[ox++] = i + (in[iix + 1] - i) * fix;
56 ix += pitch;
57 }
58 } else {
59 while (ix < ix_end && ox < ox_end) {
60 int iix = (int) ix;
61 float fix = ix - iix;
62 float i = in[iix];
63 out[ox++] = i + (in[iix + 1] - i) * fix;
64 ix += pitch;
65 pitch += pitchstep;
66 }
67 }
68 in_offset[0] = ix;
69 out_offset[0] = ox;
70 startpitch[0] = pitch;
71 }
72 }
|