annotate cdd_fader.c @ 2081:cfd53c94fffb

Initial stab at RF5C164 emulation
author Michael Pavone <pavone@retrodev.com>
date Thu, 03 Feb 2022 23:15:42 -0800
parents bafb757e1cd2
children 4fbe1e7c4a73
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include "cdd_fader.h"
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stdio.h>
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 void cdd_fader_init(cdd_fader *fader)
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 {
2081
cfd53c94fffb Initial stab at RF5C164 emulation
Michael Pavone <pavone@retrodev.com>
parents: 2080
diff changeset
6 fader->audio = render_audio_source("CDDA", 16934400, 384, 2);
2080
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 fader->cur_attenuation = 0x4000;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 fader->dst_attenuation = 0x4000;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 fader->attenuation_step = 0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 void cdd_fader_attenuation_write(cdd_fader *fader, uint16_t attenuation)
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 fader->dst_attenuation = attenuation & 0xFFF0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 fader->flags = attenuation & 0xE;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 if (fader->dst_attenuation > fader->cur_attenuation) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 fader->attenuation_step = (fader->dst_attenuation - fader->cur_attenuation) >> 4;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 } else if (fader->dst_attenuation < fader->cur_attenuation) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 fader->attenuation_step = (fader->cur_attenuation - fader->dst_attenuation) >> 4;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 } else {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 fader->attenuation_step = 0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 void cdd_fader_data(cdd_fader *fader, uint8_t byte)
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 fader->bytes[fader->byte_counter++] = byte;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 if (fader->byte_counter == sizeof(fader->bytes)) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 fader->byte_counter = 0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 int32_t left = (fader->bytes[1] << 8) | fader->bytes[0];
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 int32_t right = (fader->bytes[3] << 8) | fader->bytes[2];
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 if (left & 0x8000) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 left |= 0xFFFF0000;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 if (right & 0x8000) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 right |= 0xFFFF0000;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 if (!fader->cur_attenuation) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 left = right = 0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 } else if (fader->cur_attenuation >= 4) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 left *= fader->cur_attenuation & 0x7FF0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 right *= fader->cur_attenuation & 0x7FF0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 left >>= 14;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 right >>= 14;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 } else {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 //TODO: FIXME
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 left = right = 0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 render_put_stereo_sample(fader->audio, left, right);
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 if (fader->attenuation_step) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 if (fader->dst_attenuation > fader->cur_attenuation) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 fader->cur_attenuation += fader->attenuation_step;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 if (fader->cur_attenuation >= fader->dst_attenuation) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 fader->cur_attenuation = fader->dst_attenuation;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 fader->attenuation_step = 0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 } else {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 fader->cur_attenuation -= fader->attenuation_step;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 if (fader->cur_attenuation <= fader->dst_attenuation) {
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 fader->cur_attenuation = fader->dst_attenuation;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 fader->attenuation_step = 0;
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 }
bafb757e1cd2 Implement CD audio
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 }