1 /*
2 * SID_Acorn.i
3 *
4 * RISC OS specific parts of the sound emulation
5 * Frodo (C) 1994-1997,2002 Christian Bauer
6 * Acorn port by Andreas Dehmel, 1997
7 *
8 */
9
10 #include "C64.h"
11
12
13
init_sound(void)14 void DigitalRenderer::init_sound(void)
15 {
16 _kernel_oserror *err;
17
18 ready = false; sound_buffer = NULL;
19 if ((DigitalRenderer_ReadState() & DRState_Active) != 0)
20 {
21 _kernel_oserror dra;
22
23 dra.errnum = 0; sprintf(dra.errmess,"Can't claim sound system -- already active!");
24 Wimp_ReportError(&dra,1,TASKNAME); return;
25 }
26 // Try starting up the renderer
27 sndbufsize = 2*224; linecnt = 0;
28 if ((err = DigitalRenderer_Activate(1,sndbufsize,1000000/SAMPLE_FREQ)) != NULL)
29 {
30 Wimp_ReportError(err,1,TASKNAME); return;
31 }
32 sound_buffer = new uint8[sndbufsize];
33 ready = true;
34 }
35
36
37
38
~DigitalRenderer()39 DigitalRenderer::~DigitalRenderer()
40 {
41 if (ready)
42 {
43 _kernel_oserror *err;
44
45 delete sound_buffer;
46 if ((err = DigitalRenderer_Deactivate()) != NULL)
47 {
48 Wimp_ReportError(err,1,TASKNAME);
49 }
50 }
51 }
52
53
54
55
EmulateLine(void)56 void DigitalRenderer::EmulateLine(void)
57 {
58 if (ready)
59 {
60 sample_buf[sample_in_ptr++] = volume;
61 // faster than modulo; usually there shouldn't be a loop (while)...
62 while (sample_in_ptr >= SAMPLE_BUF_SIZE) {sample_in_ptr -= SAMPLE_BUF_SIZE;}
63
64 // A similar approach to the HP variant: check every <number> of lines if
65 // new sample needed.
66 if (--linecnt < 0)
67 {
68 int status;
69
70 linecnt = the_c64->PollSoundAfter;
71 if ((status = DigitalRenderer_ReadState()) > 0)
72 {
73 if ((status & DRState_NeedData) != 0)
74 {
75 calc_buffer(sound_buffer, sndbufsize);
76 DigitalRenderer_NewSample(sound_buffer);
77 }
78 }
79 }
80 }
81 }
82
83
84
85
Pause(void)86 void DigitalRenderer::Pause(void)
87 {
88 if (ready) {DigitalRenderer_Pause();}
89 }
90
91
92
93
Resume(void)94 void DigitalRenderer::Resume(void)
95 {
96 if (ready) {DigitalRenderer_Resume();}
97 }
98