annotate Plugins/Input/console/Fir_Resampler.h @ 352:f13ab2d8e9cf trunk

[svn] various fixes :(
author nenolod
date Mon, 26 Dec 2005 14:12:35 -0800
parents 252843aac42f
children 7c5e886205ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
2 // Finite Impulse Response (FIR) Resampler
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
3
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
4 // Game_Music_Emu 0.2.4. Copyright (C) 2004 Shay Green. GNU LGPL license.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
5
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
6 #ifndef FIR_RESAMPLER_H
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7 #define FIR_RESAMPLER_H
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9 #include "blargg_common.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 class Fir_Resampler {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 enum { width = 24 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 enum { latency = (width - 1) * 2 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 public:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 typedef short sample_t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 Fir_Resampler();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18 ~Fir_Resampler();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20 // interface hasn't been stabilized yet
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22 // Set size of buffer. Return true if out of memory.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 blargg_err_t buffer_size( int );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 // Set input/output resampling ratio and frequency rolloff. Return
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 // actual (rounded) ratio used.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 double time_ratio( double ratio, double rolloff = 0.999, double volume = 1.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 // Remove any buffered samples and clear buffer
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 void clear();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 // Pointer to buffer to write input samples to
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33 sample_t* buffer() { return write_pos; }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 // Maximum number of samples that can be written to buffer at current position
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 int max_write() const { return buf_size - (write_pos - buf); }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 // Number of unread input samples
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 int written() const { return write_pos - buf - latency; }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 // Advance buffer position by 'count' samples. Call after writing 'count' samples
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 // to buffer().
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 void write( int count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 // True if there are there aren't enough input samples to read at least one
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 // output sample.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 bool empty() const { return (write_pos - buf) <= latency; }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49 // Resample and output at most 'count' into 'buf', then remove input samples from
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50 // buffer. Return number of samples written into 'buf'.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 int read( sample_t* buf, int count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 // Skip at most 'count' *input* samples. Return number of samples actually skipped.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 int skip_input( int count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 private:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 enum { max_res = 32 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 sample_t* buf;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 sample_t* write_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 double ratio;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 int buf_size;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 int res;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 int imp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 unsigned long skip_bits;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 int step;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 sample_t impulses [max_res] [width];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 inline void Fir_Resampler::write( int count ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 write_pos += count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 assert( unsigned (write_pos - buf) <= buf_size );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76