annotate Plugins/Input/console/Effects_Buffer.cpp @ 256:84aabc053b6e trunk

[svn] C++ warning fixes by external contractor Stephen Bennett.
author chainsaw
date Sun, 04 Dec 2005 08:49:53 -0800
parents 252843aac42f
children
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 // Game_Music_Emu 0.2.4. http://www.slack.net/~ant/libs/
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 #include "Effects_Buffer.h"
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 #include <string.h>
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8 /* Copyright (C) 2003-2005 Shay Green. This module is free software; you
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9 can redistribute it and/or modify it under the terms of the GNU Lesser
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10 General Public License as published by the Free Software Foundation; either
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 version 2.1 of the License, or (at your option) any later version. This
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 module is distributed in the hope that it will be useful, but WITHOUT ANY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 more details. You should have received a copy of the GNU Lesser General
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 Public License along with this module; if not, write to the Free Software
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19 #include BLARGG_SOURCE_BEGIN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 typedef long fixed_t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 #define TO_FIXED( f ) fixed_t ((f) * (1L << 15) + 0.5)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 #define FMUL( x, y ) (((x) * (y)) >> 15)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 const unsigned echo_size = 4096;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 const unsigned echo_mask = echo_size - 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 BOOST_STATIC_ASSERT( (echo_size & echo_mask) == 0 ); // must be power of 2
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 const unsigned reverb_size = 8192 * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 const unsigned reverb_mask = reverb_size - 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 BOOST_STATIC_ASSERT( (reverb_size & reverb_mask) == 0 ); // must be power of 2
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 Effects_Buffer::config_t::config_t()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 pan_1 = 0.0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 pan_2 = 0.0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 reverb_delay = 88;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 reverb_level = 0.10;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40 echo_delay = 61;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 echo_level = 0.12;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 delay_variance = 18;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 effects_enabled = false;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 Effects_Buffer::Effects_Buffer()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 echo_buf = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49 echo_pos = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 reverb_buf = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 reverb_pos = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 stereo_remain = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 effect_remain = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 effects_enabled = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 config( config_t() );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 Effects_Buffer::~Effects_Buffer()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 delete [] echo_buf;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 delete [] reverb_buf;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 blargg_err_t Effects_Buffer::sample_rate( long rate, int msec )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68 if ( !echo_buf )
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 echo_buf = new blip_sample_t [echo_size];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 if ( !echo_buf )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 return "Out of memory";
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 if ( !reverb_buf )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 reverb_buf = new blip_sample_t [reverb_size];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 if ( !reverb_buf )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79 return "Out of memory";
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 BLARGG_RETURN_ERR( bufs [i].sample_rate( rate, msec ) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 length_ = msec;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 sample_rate_ = rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 config( config_ );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 return blargg_success;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 void Effects_Buffer::clock_rate( long rate )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96 bufs [i].clock_rate( rate );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 void Effects_Buffer::bass_freq( int freq )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 bufs [i].bass_freq( freq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 void Effects_Buffer::clear()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 stereo_remain = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 effect_remain = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 memset( echo_buf, 0, echo_size * sizeof (blip_sample_t) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110 memset( reverb_buf, 0, reverb_size * sizeof (blip_sample_t) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 bufs [i].clear();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115 inline int pin_range( int n, int max, int min = 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117 if ( n < min )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118 return min;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 if ( n > max )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 return max;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 return n;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 void Effects_Buffer::config( const config_t& cfg )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
125 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
126 // clear echo and reverb buffers
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 if ( !config_.effects_enabled && cfg.effects_enabled && echo_buf ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 memset( echo_buf, 0, echo_size * sizeof (blip_sample_t) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 memset( reverb_buf, 0, reverb_size * sizeof (blip_sample_t) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132 config_ = cfg;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
133
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
134 if ( config_.effects_enabled )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
135 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
136 // convert to internal format
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138 chans.pan_1_levels [0] = TO_FIXED( 1 ) - TO_FIXED( config_.pan_1 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 chans.pan_1_levels [1] = TO_FIXED( 2 ) - chans.pan_1_levels [0];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 chans.pan_2_levels [0] = TO_FIXED( 1 ) - TO_FIXED( config_.pan_2 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 chans.pan_2_levels [1] = TO_FIXED( 2 ) - chans.pan_2_levels [0];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 chans.reverb_level = TO_FIXED( config_.reverb_level );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 chans.echo_level = TO_FIXED( config_.echo_level );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
146
256
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
147 const int delay_offset = (int) config_.delay_variance * sample_rate_ / (1000 * 2);
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
148
256
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
149 const int reverb_sample_delay = (int) config_.reverb_delay * sample_rate_ / 1000;
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150 chans.reverb_delay_l = pin_range( reverb_size -
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 (reverb_sample_delay - delay_offset) * 2, reverb_size - 2, 0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 chans.reverb_delay_r = pin_range( reverb_size + 1 -
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
153 (reverb_sample_delay + delay_offset) * 2, reverb_size - 1, 1 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
154
256
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
155 const int echo_sample_delay = (int) config_.echo_delay * sample_rate_ / 1000;
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 chans.echo_delay_l = pin_range( echo_size - 1 - (echo_sample_delay - delay_offset),
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157 echo_size - 1 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158 chans.echo_delay_r = pin_range( echo_size - 1 - (echo_sample_delay + delay_offset),
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159 echo_size - 1 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
161 // set up outputs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 for ( unsigned i = 0; i < chan_count; i++ ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 channel_t& o = channels [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 if ( i < 2 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
165 o.center = &bufs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
166 o.left = &bufs [3];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167 o.right = &bufs [4];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170 o.center = &bufs [2];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171 o.left = &bufs [5];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172 o.right = &bufs [6];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
174 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 // set up outputs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 for ( unsigned i = 0; i < chan_count; i++ ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180 channel_t& o = channels [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
181 o.center = &bufs [0];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
182 o.left = &bufs [1];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
183 o.right = &bufs [2];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
185 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
186 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
187
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
188 void Effects_Buffer::end_frame( blip_time_t clock_count, bool stereo )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
189 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
190 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
191 bufs [i].end_frame( clock_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
193 if ( stereo )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
194 stereo_remain = bufs [0].samples_avail() + bufs [0].output_latency();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
196 if ( effects_enabled || config_.effects_enabled )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
197 effect_remain = bufs [0].samples_avail() + bufs [0].output_latency();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
198
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
199 effects_enabled = config_.effects_enabled;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 long Effects_Buffer::read_samples( blip_sample_t* out, long total_samples )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
205 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
206 require( total_samples % 2 == 0 ); // count must be even
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
207
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
208 long remain = bufs [0].samples_avail();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
209 if ( remain > (unsigned) total_samples / 2 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
210 remain = (unsigned) total_samples / 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
211 total_samples = remain;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212 while ( remain )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
213 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
214 int active_bufs = buf_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215 long count = remain;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
216
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
217 if ( effect_remain ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
218 if ( count > effect_remain )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
219 count = effect_remain;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
220
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
221 if ( stereo_remain ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
222 mix_enhanced( out, count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
223 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225 mix_mono_enhanced( out, count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226 active_bufs = 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
227 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
228 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
229 else if ( stereo_remain ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
230 mix_stereo( out, count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
231 active_bufs = 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
232 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
233 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
234 mix_mono( out, count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
235 active_bufs = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
236 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
237
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
238 out += count * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
239 remain -= count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
240
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
241 stereo_remain -= count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
242 if ( stereo_remain < 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
243 stereo_remain = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
244
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
245 effect_remain -= count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
246 if ( effect_remain < 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
247 effect_remain = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
248
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
249 for ( int i = 0; i < buf_count; i++ ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
250 if ( i < active_bufs )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
251 bufs [i].remove_samples( count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
252 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
253 bufs [i].remove_silence( count ); // keep time synchronized
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
254 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
255 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
256
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
257 return total_samples * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
258 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
259
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
260 void Effects_Buffer::mix_mono( blip_sample_t* out, long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
261 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
262 Blip_Reader c;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
263 int shift = c.begin( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
264
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
265 // unrolled loop
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
266 for ( long n = count >> 1; n--; )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
267 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
268 long cs0 = c.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
269 c.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
270
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
271 long cs1 = c.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
272 c.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
273
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
274 if ( (BOOST::int16_t) cs0 != cs0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
275 cs0 = 0x7FFF - (cs0 >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
276 ((BOOST::uint32_t*) out) [0] = ((BOOST::uint16_t) cs0) | (cs0 << 16);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
277
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
278 if ( (BOOST::int16_t) cs1 != cs1 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
279 cs1 = 0x7FFF - (cs1 >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
280 ((BOOST::uint32_t*) out) [1] = ((BOOST::uint16_t) cs1) | (cs1 << 16);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
281 out += 4;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
282 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
283
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
284 if ( count & 1 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
285 int s = c.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
286 c.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
287 out [0] = s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
288 out [1] = s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
289 if ( (BOOST::int16_t) s != s ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
290 s = 0x7FFF - (s >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
291 out [0] = s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
292 out [1] = s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
293 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
294 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
295
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
296 c.end( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
297 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
298
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
299 void Effects_Buffer::mix_stereo( blip_sample_t* out, long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
300 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
301 Blip_Reader l; l.begin( bufs [1] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
302 Blip_Reader r; r.begin( bufs [2] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
303 Blip_Reader c;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
304 int shift = c.begin( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
305
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
306 while ( count-- ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
307 int cs = c.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
308 c.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
309 int left = cs + l.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
310 int right = cs + r.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
311 l.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
312 r.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
313
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
314 if ( (BOOST::int16_t) left != left )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
315 left = 0x7FFF - (left >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
316
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
317 out [0] = left;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
318 out [1] = right;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
319
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
320 out += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
321
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
322 if ( (BOOST::int16_t) right != right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
323 out [-1] = 0x7FFF - (right >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
324 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
325
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
326 c.end( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
327 r.end( bufs [2] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
328 l.end( bufs [1] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
329 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
330
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
331 void Effects_Buffer::mix_mono_enhanced( blip_sample_t* out, long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
332 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
333 Blip_Reader sq1; sq1.begin( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
334 Blip_Reader sq2; sq2.begin( bufs [1] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
335 Blip_Reader center;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
336 int shift = center.begin( bufs [2] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
337
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
338 int echo_pos = this->echo_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
339 int reverb_pos = this->reverb_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
340
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
341 while ( count-- )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
342 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
343 int sum1_s = sq1.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
344 int sum2_s = sq2.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
345
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
346 sq1.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
347 sq2.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
348
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
349 int new_reverb_l = FMUL( sum1_s, chans.pan_1_levels [0] ) +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
350 FMUL( sum2_s, chans.pan_2_levels [0] ) +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
351 reverb_buf [(reverb_pos + chans.reverb_delay_l) & reverb_mask];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
352
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
353 int new_reverb_r = FMUL( sum1_s, chans.pan_1_levels [1] ) +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
354 FMUL( sum2_s, chans.pan_2_levels [1] ) +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
355 reverb_buf [(reverb_pos + chans.reverb_delay_r) & reverb_mask];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
356
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
357 fixed_t reverb_level = chans.reverb_level;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
358 reverb_buf [reverb_pos] = FMUL( new_reverb_l, reverb_level );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
359 reverb_buf [reverb_pos + 1] = FMUL( new_reverb_r, reverb_level );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
360 reverb_pos = (reverb_pos + 2) & reverb_mask;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
361
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
362 int sum3_s = center.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
363 center.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
364
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
365 int left = new_reverb_l + sum3_s + FMUL( chans.echo_level,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
366 echo_buf [(echo_pos + chans.echo_delay_l) & echo_mask] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
367 int right = new_reverb_r + sum3_s + FMUL( chans.echo_level,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
368 echo_buf [(echo_pos + chans.echo_delay_r) & echo_mask] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
369
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
370 echo_buf [echo_pos] = sum3_s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
371 echo_pos = (echo_pos + 1) & echo_mask;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
372
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
373 if ( (BOOST::int16_t) left != left )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
374 left = 0x7FFF - (left >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
375
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
376 out [0] = left;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
377 out [1] = right;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
378
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
379 out += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
380
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
381 if ( (BOOST::int16_t) right != right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
382 out [-1] = 0x7FFF - (right >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
383 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
384 this->reverb_pos = reverb_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
385 this->echo_pos = echo_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
386
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
387 sq1.end( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
388 sq2.end( bufs [1] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
389 center.end( bufs [2] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
390 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
391
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
392 void Effects_Buffer::mix_enhanced( blip_sample_t* out, long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
393 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
394 Blip_Reader l1; l1.begin( bufs [3] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
395 Blip_Reader r1; r1.begin( bufs [4] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
396 Blip_Reader l2; l2.begin( bufs [5] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
397 Blip_Reader r2; r2.begin( bufs [6] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
398 Blip_Reader sq1; sq1.begin( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
399 Blip_Reader sq2; sq2.begin( bufs [1] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
400 Blip_Reader center;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
401 int shift = center.begin( bufs [2] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
402
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
403 int echo_pos = this->echo_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
404 int reverb_pos = this->reverb_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
405
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
406 while ( count-- )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
407 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
408 int sum1_s = sq1.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
409 int sum2_s = sq2.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
410
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
411 sq1.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
412 sq2.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
413
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
414 int new_reverb_l = FMUL( sum1_s, chans.pan_1_levels [0] ) +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
415 FMUL( sum2_s, chans.pan_2_levels [0] ) + l1.read() +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
416 reverb_buf [(reverb_pos + chans.reverb_delay_l) & reverb_mask];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
417
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
418 int new_reverb_r = FMUL( sum1_s, chans.pan_1_levels [1] ) +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
419 FMUL( sum2_s, chans.pan_2_levels [1] ) + r1.read() +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
420 reverb_buf [(reverb_pos + chans.reverb_delay_r) & reverb_mask];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
421
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
422 l1.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
423 r1.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
424
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
425 fixed_t reverb_level = chans.reverb_level;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
426 reverb_buf [reverb_pos] = FMUL( new_reverb_l, reverb_level );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
427 reverb_buf [reverb_pos + 1] = FMUL( new_reverb_r, reverb_level );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
428 reverb_pos = (reverb_pos + 2) & reverb_mask;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
429
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
430 int sum3_s = center.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
431 center.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
432
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
433 int left = new_reverb_l + sum3_s + l2.read() + FMUL( chans.echo_level,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
434 echo_buf [(echo_pos + chans.echo_delay_l) & echo_mask] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
435 int right = new_reverb_r + sum3_s + r2.read() + FMUL( chans.echo_level,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
436 echo_buf [(echo_pos + chans.echo_delay_r) & echo_mask] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
437
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
438 l2.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
439 r2.next( shift );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
440
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
441 echo_buf [echo_pos] = sum3_s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
442 echo_pos = (echo_pos + 1) & echo_mask;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
443
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
444 if ( (BOOST::int16_t) left != left )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
445 left = 0x7FFF - (left >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
446
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
447 out [0] = left;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
448 out [1] = right;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
449
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
450 out += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
451
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
452 if ( (BOOST::int16_t) right != right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
453 out [-1] = 0x7FFF - (right >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
454 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
455 this->reverb_pos = reverb_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
456 this->echo_pos = echo_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
457
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
458 sq1.end( bufs [0] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
459 sq2.end( bufs [1] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
460 center.end( bufs [2] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
461 l1.end( bufs [3] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
462 r1.end( bufs [4] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
463 l2.end( bufs [5] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
464 r2.end( bufs [6] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
465 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
466