Main Page | Class Hierarchy | Compound List | File List | Compound Members | File Members | Related Pages

SID_Acorn.i

Go to the documentation of this file.
00001 /*
00002  * SID_Acorn.i
00003  *
00004  * RISC OS specific parts of the sound emulation
00005  * Frodo (C) 1994-1997 Christian Bauer
00006  * Acorn port by Andreas Dehmel, 1997
00007  *
00008  */
00009 
00010 #include "C64.h"
00011 
00012 
00013 
00014 void DigitalRenderer::init_sound(void)
00015 {
00016   _kernel_oserror *err;
00017 
00018   ready = false; sound_buffer = NULL;
00019   if ((DigitalRenderer_ReadState() & DRState_Active) != 0)
00020   {
00021     _kernel_oserror dra;
00022 
00023     dra.errnum = 0; sprintf(dra.errmess,"Can't claim sound system -- already active!");
00024     Wimp_ReportError(&dra,1,TASKNAME); return;
00025   }
00026   // Try starting up the renderer
00027   sndbufsize = 2*224; linecnt = 0;
00028   if ((err = DigitalRenderer_Activate(1,sndbufsize,1000000/SAMPLE_FREQ)) != NULL)
00029   {
00030     Wimp_ReportError(err,1,TASKNAME); return;
00031   }
00032   sound_buffer = new uint8[sndbufsize];
00033   ready = true;
00034 }
00035 
00036 
00037 
00038 
00039 DigitalRenderer::~DigitalRenderer()
00040 {
00041   if (ready)
00042   {
00043     _kernel_oserror *err;
00044 
00045     delete sound_buffer;
00046     if ((err = DigitalRenderer_Deactivate()) != NULL)
00047     {
00048       Wimp_ReportError(err,1,TASKNAME);
00049     }
00050   }
00051 }
00052 
00053 
00054 
00055 
00056 void DigitalRenderer::EmulateLine(void)
00057 {
00058   if (ready)
00059   {
00060     sample_buf[sample_in_ptr++] = volume;
00061     // faster than modulo; usually there shouldn't be a loop (while)...
00062     while (sample_in_ptr >= SAMPLE_BUF_SIZE) {sample_in_ptr -= SAMPLE_BUF_SIZE;}
00063 
00064     // A similar approach to the HP variant: check every <number> of lines if
00065     // new sample needed.
00066     if (--linecnt < 0)
00067     {
00068       int status;
00069 
00070       linecnt = the_c64->PollSoundAfter;
00071       if ((status = DigitalRenderer_ReadState()) > 0)
00072       {
00073         if ((status & DRState_NeedData) != 0)
00074         {
00075           calc_buffer(sound_buffer, sndbufsize);
00076           DigitalRenderer_NewSample(sound_buffer);
00077         }
00078       }
00079     }
00080   }
00081 }
00082 
00083 
00084 
00085 
00086 void DigitalRenderer::Pause(void)
00087 {
00088   if (ready) {DigitalRenderer_Pause();}
00089 }
00090 
00091 
00092 
00093 
00094 void DigitalRenderer::Resume(void)
00095 {
00096   if (ready) {DigitalRenderer_Resume();}
00097 }

Generated on Tue Feb 8 04:08:10 2005 for E32frodo by doxygen 1.3.3