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