comparison psg.c @ 2196:2648081f3100

Implement Game Gear PSG panning
author Michael Pavone <pavone@retrodev.com>
date Sun, 21 Aug 2022 23:14:08 -0700
parents cfd53c94fffb
children 71b0cb7c34a6
comparison
equal deleted inserted replaced
2195:40290a923886 2196:2648081f3100
11 #include <stdio.h> 11 #include <stdio.h>
12 #include <math.h> 12 #include <math.h>
13 void psg_init(psg_context * context, uint32_t master_clock, uint32_t clock_div) 13 void psg_init(psg_context * context, uint32_t master_clock, uint32_t clock_div)
14 { 14 {
15 memset(context, 0, sizeof(*context)); 15 memset(context, 0, sizeof(*context));
16 context->audio = render_audio_source("PSG", master_clock, clock_div, 1); 16 context->audio = render_audio_source("PSG", master_clock, clock_div, 2);
17 context->clock_inc = clock_div; 17 context->clock_inc = clock_div;
18 for (int i = 0; i < 4; i++) { 18 for (int i = 0; i < 4; i++) {
19 context->volume[i] = 0xF; 19 context->volume[i] = 0xF;
20 } 20 }
21 context->pan = 0xFF;
21 } 22 }
22 23
23 void psg_free(psg_context *context) 24 void psg_free(psg_context *context)
24 { 25 {
25 render_free_source(context->audio); 26 render_free_source(context->audio);
108 } 109 }
109 } 110 }
110 } 111 }
111 } 112 }
112 113
113 int16_t accum = 0; 114 int16_t left_accum = 0, right_accum = 0;
115 uint8_t pan_left = 0x10, pan_right = 0x1;
114 116
115 for (int i = 0; i < 3; i++) { 117 for (int i = 0; i < 3; i++) {
116 if (context->output_state[i]) { 118 if (context->output_state[i]) {
117 accum += volume_table[context->volume[i]]; 119 int16_t value = volume_table[context->volume[i]];
120 if (context->pan & pan_left) {
121 left_accum += value;
122 }
123 if (context->pan & pan_right) {
124 right_accum += value;
125 }
126 pan_left <<= 1;
127 pan_right <<= 1;
118 } 128 }
119 } 129 }
120 if (context->noise_out) { 130 if (context->noise_out) {
121 accum += volume_table[context->volume[3]]; 131 int16_t value = volume_table[context->volume[3]];
122 } 132 if (context->pan & pan_left) {
123 133 left_accum += value;
124 render_put_mono_sample(context->audio, accum); 134 }
135 if (context->pan & pan_right) {
136 right_accum += value;
137 }
138 }
139
140 render_put_stereo_sample(context->audio, left_accum, right_accum);
125 141
126 context->cycles += context->clock_inc; 142 context->cycles += context->clock_inc;
127 } 143 }
128 } 144 }
129 145