OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 28 matching lines...) Expand all Loading... |
39 | 39 |
40 // SincResampler is a high-quality sample-rate converter. | 40 // SincResampler is a high-quality sample-rate converter. |
41 | 41 |
42 class PLATFORM_EXPORT SincResampler { | 42 class PLATFORM_EXPORT SincResampler { |
43 USING_FAST_MALLOC(SincResampler); | 43 USING_FAST_MALLOC(SincResampler); |
44 WTF_MAKE_NONCOPYABLE(SincResampler); | 44 WTF_MAKE_NONCOPYABLE(SincResampler); |
45 | 45 |
46 public: | 46 public: |
47 // scaleFactor == sourceSampleRate / destinationSampleRate | 47 // scaleFactor == sourceSampleRate / destinationSampleRate |
48 // kernelSize can be adjusted for quality (higher is better) | 48 // kernelSize can be adjusted for quality (higher is better) |
49 // numberOfKernelOffsets is used for interpolation and is the number of sub-sa
mple kernel shifts. | 49 // numberOfKernelOffsets is used for interpolation and is the number of |
| 50 // sub-sample kernel shifts. |
50 SincResampler(double scaleFactor, | 51 SincResampler(double scaleFactor, |
51 unsigned kernelSize = 32, | 52 unsigned kernelSize = 32, |
52 unsigned numberOfKernelOffsets = 32); | 53 unsigned numberOfKernelOffsets = 32); |
53 | 54 |
54 // Processes numberOfSourceFrames from source to produce numberOfSourceFrames
/ scaleFactor frames in destination. | 55 // Processes numberOfSourceFrames from source to produce numberOfSourceFrames |
| 56 // / scaleFactor frames in destination. |
55 void process(const float* source, | 57 void process(const float* source, |
56 float* destination, | 58 float* destination, |
57 unsigned numberOfSourceFrames); | 59 unsigned numberOfSourceFrames); |
58 | 60 |
59 // Process with input source callback function for streaming applications. | 61 // Process with input source callback function for streaming applications. |
60 void process(AudioSourceProvider*, | 62 void process(AudioSourceProvider*, |
61 float* destination, | 63 float* destination, |
62 size_t framesToProcess); | 64 size_t framesToProcess); |
63 | 65 |
64 protected: | 66 protected: |
65 void initializeKernel(); | 67 void initializeKernel(); |
66 void consumeSource(float* buffer, unsigned numberOfSourceFrames); | 68 void consumeSource(float* buffer, unsigned numberOfSourceFrames); |
67 | 69 |
68 double m_scaleFactor; | 70 double m_scaleFactor; |
69 unsigned m_kernelSize; | 71 unsigned m_kernelSize; |
70 unsigned m_numberOfKernelOffsets; | 72 unsigned m_numberOfKernelOffsets; |
71 | 73 |
72 // m_kernelStorage has m_numberOfKernelOffsets kernels back-to-back, each of s
ize m_kernelSize. | 74 // m_kernelStorage has m_numberOfKernelOffsets kernels back-to-back, each of |
73 // The kernel offsets are sub-sample shifts of a windowed sinc() shifted from
0.0 to 1.0 sample. | 75 // size m_kernelSize. The kernel offsets are sub-sample shifts of a windowed |
| 76 // sinc() shifted from 0.0 to 1.0 sample. |
74 AudioFloatArray m_kernelStorage; | 77 AudioFloatArray m_kernelStorage; |
75 | 78 |
76 // m_virtualSourceIndex is an index on the source input buffer with sub-sample
precision. | 79 // m_virtualSourceIndex is an index on the source input buffer with sub-sample |
77 // It must be double precision to avoid drift. | 80 // precision. It must be double precision to avoid drift. |
78 double m_virtualSourceIndex; | 81 double m_virtualSourceIndex; |
79 | 82 |
80 // This is the number of destination frames we generate per processing pass on
the buffer. | 83 // This is the number of destination frames we generate per processing pass on |
| 84 // the buffer. |
81 unsigned m_blockSize; | 85 unsigned m_blockSize; |
82 | 86 |
83 // Source is copied into this buffer for each processing pass. | 87 // Source is copied into this buffer for each processing pass. |
84 AudioFloatArray m_inputBuffer; | 88 AudioFloatArray m_inputBuffer; |
85 | 89 |
86 const float* m_source; | 90 const float* m_source; |
87 unsigned m_sourceFramesAvailable; | 91 unsigned m_sourceFramesAvailable; |
88 | 92 |
89 // m_sourceProvider is used to provide the audio input stream to the resampler
. | 93 // m_sourceProvider is used to provide the audio input stream to the |
| 94 // resampler. |
90 AudioSourceProvider* m_sourceProvider; | 95 AudioSourceProvider* m_sourceProvider; |
91 | 96 |
92 // The buffer is primed once at the very beginning of processing. | 97 // The buffer is primed once at the very beginning of processing. |
93 bool m_isBufferPrimed; | 98 bool m_isBufferPrimed; |
94 }; | 99 }; |
95 | 100 |
96 } // namespace blink | 101 } // namespace blink |
97 | 102 |
98 #endif // SincResampler_h | 103 #endif // SincResampler_h |
OLD | NEW |