annotate Plugins/Input/console/Gym_Emu.cpp @ 90:252843aac42f trunk

[svn] Import the initial sources for console music support.
author nenolod
date Tue, 01 Nov 2005 19:57:26 -0800
parents
children 84aabc053b6e
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 "Gym_Emu.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 "ym2612.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 #include <string.h>
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10 /* 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
11 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
12 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
13 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
14 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
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 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
17 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
18 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
19 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
20
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 #include BLARGG_SOURCE_BEGIN
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 const long base_clock = 53700300;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 const long clock_rate = base_clock / 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 Gym_Emu::Gym_Emu()
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 data = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 pos = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 mem = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 pairs_per_frame = 0;
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 Gym_Emu::~Gym_Emu()
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 unload();
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 void Gym_Emu::unload()
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 delete [] mem;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 mem = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 data = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 pos = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 track_ended_ = false;
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 blargg_err_t Gym_Emu::init( long sample_rate, double gain, double oversample_ )
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 require( oversample_ <= 4.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 blip_eq_t eq( -32, 8000, sample_rate );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 apu.treble_eq( eq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 apu.volume( 0.27 * gain );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 dac_synth.treble_eq( eq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 dac_synth.volume( 0.25 * gain );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 oversample = resampler.time_ratio( oversample_, 0.990, gain );
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 pairs_per_frame = sample_rate / 60;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 oversamples_per_frame = int (pairs_per_frame * oversample) * 2 + 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 clocks_per_sample = (double) clock_rate / sample_rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 BLARGG_RETURN_ERR( resampler.buffer_size( oversamples_per_frame + 256 ) );
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 BLARGG_RETURN_ERR( blip_buf.sample_rate( sample_rate, 1000 / 30 ) );
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 BLARGG_RETURN_ERR( fm.set_rate( sample_rate * oversample, base_clock / 7 ) );
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 blip_buf.clock_rate( clock_rate );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 return blargg_success;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 void Gym_Emu::mute_voices( int mask )
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 fm.mute_voices( mask );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 dac_disabled = mask & 0x40;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 apu.output( (mask & 0x80) ? NULL : &blip_buf );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 const char** Gym_Emu::voice_names() const
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 static const char* names [] = {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 "FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "PCM", "SN76489"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 return names;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 static blargg_err_t check_header( const Gym_Emu::header_t& h, int* data_offset = NULL )
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 if ( memcmp( h.tag, "GYMX", 4 ) == 0 )
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 if ( memcmp( h.packed, "\0\0\0\0", 4 ) != 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 return "Packed GYM file not supported";
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 if ( data_offset )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 *data_offset = sizeof h;
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 else if ( h.tag [0] != 0 && h.tag [0] != 1 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100 // not a headerless GYM
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 // to do: more thorough check, or just require a damn header
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 return "Not a GYM file";
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 return blargg_success;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 blargg_err_t Gym_Emu::load_( const void* file, long data_offset, long file_size )
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 require( pairs_per_frame );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 data = (const byte*) file + data_offset;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 data_end = (const byte*) file + file_size;
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 loop_begin = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 loop_offset = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117 if ( data_offset )
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 const header_t& h = *(header_t*) file;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 loop_offset =
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 h.loop [3] * 0x1000000L +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 h.loop [2] * 0x10000L +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 h.loop [1] * 0x100L +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 h.loop [0];
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 track_count_ = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 voice_count_ = 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 mute_voices( 0 );
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 return blargg_success;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132 }
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 blargg_err_t Gym_Emu::load( const void* file, long file_size )
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 unload();
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 if ( file_size < sizeof (header_t) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 return "Not a GYM file";
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 int data_offset = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 BLARGG_RETURN_ERR( check_header( *(header_t*) file, &data_offset ) );
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 return load_( file, data_offset, file_size );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 }
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 blargg_err_t Gym_Emu::load( const header_t& h, Emu_Reader& in )
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 unload();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 int data_offset = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 BLARGG_RETURN_ERR( check_header( h, &data_offset ) );
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 long file_size = sizeof h + in.remain();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155 mem = new byte [file_size];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 if ( !mem )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157 return "Out of memory";
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158 memcpy( mem, &h, sizeof h );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159 BLARGG_RETURN_ERR( in.read( mem + sizeof h, file_size - sizeof h ) );
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 return load_( mem, data_offset, file_size );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 int Gym_Emu::track_length() const
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
165 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
166 if ( loop_offset || loop_begin )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167 return 0;
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 long time = 0; // 1/60 sec frames
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170 const byte* p = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171 while ( p < data_end )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 switch ( *p++ )
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 case 0:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 time++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 case 1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180 case 2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
181 ++p;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
182 case 3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
183 ++p;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 break;
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 default:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
187 dprintf( "Bad command: %02X\n", (int) p [-1] );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
188 break;
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 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
191
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192 return (time + 30 + 59) / 60;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
193 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
194
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195 blargg_err_t Gym_Emu::start_track( int )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
196 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
197 require( data );
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 pos = &data [0];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200 extra_pos = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201 loop_remain = loop_offset;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203 prev_dac_count = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 dac_enabled = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
205 last_dac = -1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
206
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
207 fm.reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
208 apu.reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
209 blip_buf.clear( false );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
210 resampler.clear();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
211
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212 track_ended_ = false;
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 return blargg_success;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215 }
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 void Gym_Emu::play_frame( sample_t* out )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
218 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
219 parse_frame();
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 // run SMS APU and buffer
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
222 blip_time_t clock_count = (pairs_per_frame + 1 - blip_buf.samples_avail()) *
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
223 clocks_per_sample;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224 apu.end_frame( clock_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225 blip_buf.end_frame( clock_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226 assert( unsigned (blip_buf.samples_avail() - pairs_per_frame) <= 4 );
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 // run fm
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
229 const int sample_count = oversamples_per_frame - resampler.written();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
230 sample_t* buf = resampler.buffer();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
231 memset( buf, 0, sample_count * sizeof *buf );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
232 fm.run( buf, sample_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
233 resampler.write( sample_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
234 int count = resampler.read( sample_buf, pairs_per_frame * 2 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
235 assert( count <= sample_buf_size );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
236 assert( unsigned (count - pairs_per_frame * 2) < 32 );
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 // mix outputs
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
239 mix_samples( out );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
240 blip_buf.remove_samples( pairs_per_frame );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
241 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
242
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
243 blargg_err_t Gym_Emu::play( long count, sample_t* out )
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 require( pos );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
246
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
247 const int samples_per_frame = pairs_per_frame * 2;
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 // empty extra buffer
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
250 if ( extra_pos ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
251 int n = samples_per_frame - extra_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
252 if ( n > count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
253 n = count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
254 memcpy( out, sample_buf + extra_pos, n * sizeof *out );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
255 out += n;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
256 count -= n;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
257 extra_pos = (extra_pos + n) % samples_per_frame;
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 // entire frames
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
261 while ( count >= samples_per_frame ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
262 play_frame( out );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
263 out += samples_per_frame;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
264 count -= samples_per_frame;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
265 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
266
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
267 // extra
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
268 if ( count ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
269 play_frame( sample_buf );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
270 extra_pos = count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
271 memcpy( out, sample_buf, count * sizeof *out );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
272 out += count;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
275 return blargg_success;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
276 }
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 blargg_err_t Gym_Emu::skip( long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
279 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
280 // to do: figure out why total muting generated access violation on MorphOS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
281 const int buf_size = 1024;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
282 sample_t buf [buf_size];
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 while ( count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
285 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
286 int n = buf_size;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
287 if ( n > count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
288 n = count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
289 count -= n;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
290 BLARGG_RETURN_ERR( play( n, buf ) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
291 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
292
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
293 return blargg_success;
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 void Gym_Emu::run_dac( int dac_count )
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 if ( !dac_disabled )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
299 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
300 // Guess beginning and end of sample and adjust rate and buffer position accordingly.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
301
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
302 // count dac samples in next frame
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
303 int next_dac_count = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
304 const byte* p = this->pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
305 int cmd;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
306 while ( (cmd = *p++) != 0 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
307 int data = *p++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
308 if ( cmd <= 2 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
309 ++p;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
310 if ( cmd == 1 && data == 0x2A )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
311 next_dac_count++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
312 }
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 // adjust
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
315 int rate_count = dac_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
316 int start = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
317 if ( !prev_dac_count && next_dac_count && dac_count < next_dac_count ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
318 rate_count = next_dac_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
319 start = next_dac_count - dac_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
320 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
321 else if ( prev_dac_count && !next_dac_count && dac_count < prev_dac_count ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
322 rate_count = prev_dac_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
323 }
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 // Evenly space samples within buffer section being used
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
326 Blip_Buffer::resampled_time_t period =
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
327 blip_buf.resampled_duration( clock_rate / 60 ) / rate_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
328
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
329 Blip_Buffer::resampled_time_t time = blip_buf.resampled_time( 0 ) +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
330 period * start + (period >> 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
331
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
332 int last_dac = this->last_dac;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
333 if ( last_dac < 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
334 last_dac = dac_buf [0];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
335
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
336 for ( int i = 0; i < dac_count; i++ )
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 diff = dac_buf [i] - last_dac;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
339 last_dac += diff;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
340 dac_synth.offset_resampled( time, diff, &blip_buf );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
341 time += period;
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 this->last_dac = last_dac;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
344 }
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 int const step = 6 * oversample;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
347 int remain = pairs_per_frame * oversample;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
348 while ( remain ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
349 int n = step;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
350 if ( n > remain )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
351 n = remain;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
352 remain -= n;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
353 fm.run_timer( n );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
354 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
355 }
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 void Gym_Emu::parse_frame()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
358 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
359 if ( track_ended_ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
360 return;
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 dac_count = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
363
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
364 const byte* pos = this->pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
365 if ( loop_remain && !--loop_remain )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
366 loop_begin = pos; // find loop on first time through sequence
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
367 int cmd;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
368 while ( (cmd = *pos++) != 0 )
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 int data = *pos++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
371 if ( cmd == 1 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
372 int data2 = *pos++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
373 if ( data == 0x2A ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
374 if ( dac_count < sizeof dac_buf ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
375 dac_buf [dac_count] = data2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
376 dac_count += dac_enabled;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
377 }
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 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
380 if ( data == 0x2B )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
381 dac_enabled = (data2 & 0x80) != 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
382
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
383 fm.write( 0, data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
384 fm.write( 1, data2 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
385 }
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 else if ( cmd == 2 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
388 fm.write( 2, data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
389 fm.write( 3, *pos++ );
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 else if ( cmd == 3 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
392 apu.write_data( 0, data );
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 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
395 dprintf( "Bad command: %02X\n", (int) cmd );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
396 --pos; // put data back
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
397 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
398 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
399 // loop
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
400 if ( pos >= data_end ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
401 if ( loop_begin )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
402 pos = loop_begin;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
403 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
404 track_ended_ = true;
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 this->pos = pos;
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 // dac
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
409 if ( dac_count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
410 run_dac( dac_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
411 prev_dac_count = dac_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
412 }
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 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
415
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
416 void Gym_Emu::mix_samples( sample_t* out )
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 // Mix one frame of Blip_Buffer (SMS APU and PCM) and resampled YM audio
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
419 Blip_Reader sn;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
420 int bass = sn.begin( blip_buf );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
421 const sample_t* ym = sample_buf;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
422
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
423 for ( int n = pairs_per_frame; n--; )
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 int s = sn.read();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
426 long l = ym [0] * 2 + s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
427 sn.next( bass );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
428 if ( (BOOST::int16_t) l != l )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
429 l = 0x7FFF - (l >> 24);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
430 long r = ym [1] * 2 + s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
431 ym += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
432 out [0] = l;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
433 out [1] = r;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
434 out += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
435 if ( (BOOST::int16_t) r != r )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
436 out [-1] = 0x7FFF - (r >> 24);
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
439 sn.end( blip_buf );
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