00001
00002
00003
00004
00005
00006
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
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
00062 while (sample_in_ptr >= SAMPLE_BUF_SIZE) {sample_in_ptr -= SAMPLE_BUF_SIZE;}
00063
00064
00065
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 }