annotate Plugins/Input/console/Panning_Buffer.cpp @ 352:f13ab2d8e9cf trunk

[svn] various fixes :(
author nenolod
date Mon, 26 Dec 2005 14:12:35 -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 "Panning_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 Panning_Buffer::Panning_Buffer()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 bufs = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 buf_count = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 bass_freq_ = -1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 clock_rate_ = -1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 }
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 Panning_Buffer::~Panning_Buffer()
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 delete [] bufs;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 blargg_err_t Panning_Buffer::sample_rate( long rate, int msec )
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 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 BLARGG_RETURN_ERR( bufs [i].sample_rate( rate, msec ) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 sample_rate_ = rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 length_ = buf_count ? bufs [0].length() : msec;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 return blargg_success;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 }
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 void Panning_Buffer::bass_freq( int freq )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50 bass_freq_ = freq;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 bufs [i].bass_freq( freq );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 void Panning_Buffer::clock_rate( long rate )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 clock_rate_ = rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 bufs [i].clock_rate( clock_rate_ );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 }
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 void Panning_Buffer::clear()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 bufs [i].clear();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 }
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 blargg_err_t Panning_Buffer::set_channel_count( int count )
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 count += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 if ( count != buf_count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 delete [] bufs;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 bufs = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 bufs = new buf_t [count];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 if ( !bufs )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 return "Out of memory";
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 buf_count = count;
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 if ( sample_rate_ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 BLARGG_RETURN_ERR( sample_rate( sample_rate_, length_ ) );
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 if ( clock_rate_ >= 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 clock_rate( clock_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 if ( bass_freq_ >= 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 bass_freq( bass_freq_ );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 set_pan( left_chan, 1.0, 0.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 set_pan( right_chan, 0.0, 1.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 for ( int i = 0; i < buf_count - 2; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 set_pan( i, 1.0, 1.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96 return blargg_success;
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 Panning_Buffer::channel_t Panning_Buffer::channel( int i )
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 i += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 require( i < buf_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 channel_t ch;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104 ch.center = &bufs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 ch.left = &bufs [buf_count];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 ch.right = &bufs [buf_count];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 return ch;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111 void Panning_Buffer::set_pan( int i, double left, double right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 i += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114 require( i < buf_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115 bufs [i].left_gain = TO_FIXED( left );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 bufs [i].right_gain = TO_FIXED( right );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 void Panning_Buffer::end_frame( blip_time_t time, bool )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 for ( int i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 bufs [i].end_frame( time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 }
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 long Panning_Buffer::read_samples( blip_sample_t* out, long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 require( count % 2 == 0 ); // count must be even
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 long avail = bufs [0].samples_avail() * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131 if ( count > avail )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132 count = avail;
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 ( count )
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 memset( out, 0, count * sizeof *out );
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 int pair_count = count >> 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140 int i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 for ( i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 add_panned( bufs [i], out, pair_count );
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 for ( i = 0; i < buf_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 bufs [i].remove_samples( pair_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
146 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
147 return count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
148 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
149
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 void Panning_Buffer::add_panned( buf_t& buf, blip_sample_t* out, long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
153 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
154 Blip_Reader in;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 fixed_t left_gain = buf.left_gain;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157 fixed_t right_gain = buf.right_gain;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158 int bass = in.begin( buf );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160 while ( count-- )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
161 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 long s = in.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 long l = out [0] + FMUL( s, left_gain );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 long r = out [1] + FMUL( s, right_gain );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
165 in.next();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
166
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167 if ( (BOOST::int16_t) l != l )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168 l = 0x7FFF - (l >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170 out [0] = l;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171 out [1] = r;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172 out += 2;
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 if ( (BOOST::int16_t) r != r )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175 out [-1] = 0x7FFF - (r >> 24);
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 in.end( buf );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180