Mercurial > repos > blastem
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 |