Welcome to mirror list, hosted at ThFree Co, Russian Federation.

AUD_JOSResampleReader.h « intern « audaspace « intern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: fb68e4dc9f5c9a503033abb1cd0141a5a92da7b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
 * Copyright 2009-2011 Jörg Hermann Müller
 *
 * This file is part of AudaSpace.
 *
 * Audaspace is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * AudaSpace is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Audaspace; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * ***** END GPL LICENSE BLOCK *****
 */

/** \file audaspace/intern/AUD_JOSResampleReader.h
 *  \ingroup audaspaceintern
 */


#ifndef __AUD_JOSRESAMPLEREADER_H__
#define __AUD_JOSRESAMPLEREADER_H__

#include "AUD_ResampleReader.h"
#include "AUD_Buffer.h"

/**
 * This resampling reader uses Julius O. Smith's resampling algorithm.
 */
class AUD_JOSResampleReader : public AUD_ResampleReader
{
private:
	typedef void (AUD_JOSResampleReader::*AUD_resample_f)(double target_factor, int length, sample_t* buffer);

	/**
	 * The half filter length.
	 */
	static const int m_len;

	/**
	 * The sample step size for the filter.
	 */
	static const int m_L;

	/**
	 * The filter coefficients.
	 */
	static const float m_coeff[];

	/**
	 * The reader channels.
	 */
	AUD_Channels m_channels;

	/**
	 * The sample position in the cache.
	 */
	unsigned int m_n;

	/**
	 * The subsample position in the cache.
	 */
	double m_P;

	/**
	 * The input data buffer.
	 */
	AUD_Buffer m_buffer;

	/**
	 * Double buffer for the sums.
	 */
	AUD_Buffer m_sums;

	/**
	 * How many samples in the cache are valid.
	 */
	int m_cache_valid;

	/**
	 * Resample function.
	 */
	AUD_resample_f m_resample;

	/**
	 * Last resampling factor.
	 */
	double m_last_factor;

	// hide copy constructor and operator=
	AUD_JOSResampleReader(const AUD_JOSResampleReader&);
	AUD_JOSResampleReader& operator=(const AUD_JOSResampleReader&);

	/**
	 * Resets the resampler to its initial state.
	 */
	void reset();

	/**
	 * Updates the buffer to be as small as possible for the coming reading.
	 * \param size The size of samples to be read.
	 * \param factor The next resampling factor.
	 * \param samplesize The size of a sample.
	 */
	void updateBuffer(int size, double factor, int samplesize);

	void resample(double target_factor, int length, sample_t* buffer);
	void resample_mono(double target_factor, int length, sample_t* buffer);
	void resample_stereo(double target_factor, int length, sample_t* buffer);

public:
	/**
	 * Creates a resampling reader.
	 * \param reader The reader to mix.
	 * \param specs The target specification.
	 */
	AUD_JOSResampleReader(boost::shared_ptr<AUD_IReader> reader, AUD_Specs specs);

	virtual void seek(int position);
	virtual int getLength() const;
	virtual int getPosition() const;
	virtual AUD_Specs getSpecs() const;
	virtual void read(int& length, bool& eos, sample_t* buffer);
};

#endif //__AUD_JOSRESAMPLEREADER_H__