/* * NewOswan * audio.c: * Based on the original Oswan-unix * Copyright (c) 2014-2021 986-Studio. All rights reserved. * */ //////////////////////////////////////////////////////////////////////////////// // // Sound information thanks to toshi (wscamp wonderswan emulator) // Note that sound is far from perfect for now. // // fixes by zalas 2002-08-21 // // // //////////////////////////////////////////////////////////////////////////////// // alternate the commenting of the following defines to get audio port tracing #define dbgprintf(...) //#define dbgprintf(...) printf(...) #include #include #include #include #include #include #include #include "log.h" #include "rom.h" #include "./nec/nec.h" #include "memory.h" #include "io.h" #include "audio.h" #define SNDP ws_ioRam[0x80] #define SNDV ws_ioRam[0x88] #define SNDSWP ws_ioRam[0x8C] #define SWPSTP ws_ioRam[0x8D] #define NSCTL ws_ioRam[0x8E] #define WAVDTP ws_ioRam[0x8F] #define SNDMOD ws_ioRam[0x90] #define SNDOUT ws_ioRam[0x91] #define PCSRL ws_ioRam[0x92] #define PCSRH ws_ioRam[0x93] #define DMASL ws_ioRam[0x40] #define DMASH ws_ioRam[0x41] #define DMASB ws_ioRam[0x42] #define DMADB ws_ioRam[0x43] #define DMADL ws_ioRam[0x44] #define DMADH ws_ioRam[0x45] #define DMACL ws_ioRam[0x46] #define DMACH ws_ioRam[0x47] #define DMACTL ws_ioRam[0x48] #define SDMASL ws_ioRam[0x4A] #define SDMASH ws_ioRam[0x4B] #define SDMASB ws_ioRam[0x4C] #define SDMACL ws_ioRam[0x4E] #define SDMACH ws_ioRam[0x4F] #define SDMACTL ws_ioRam[0x52] #define BPS 44100 #define BPSMAX AUDIO_MAX_FREQUENCY #define BPSMIN AUDIO_MIN_FREQUENCY #define BUFSIZE 1024 #define BUFSIZEN 0x10000 #define BUFSIZEP 159 #define PCMNUM 100 #define POFF 128 #define PDIV 3 #define PH POFF+PDIV*8 #define PL POFF-PDIV*7 int WaveMap; int ChPerInit; int SwpTime; int SwpStep; unsigned int SwpCurPeriod; int MainVol = 15; int HardVol = 3; int ChCurVol[6] = {-1, -1, -1, -1, -1, -1}; int ChCurPer[6] = {-1, -1, -1, -1, -1, -1}; long ChCurPan[6] = {-1, -1, -1, -1, -1, -1}; unsigned char PData[4][BUFSIZE]; unsigned char PDataP[BUFSIZEP << 4]; unsigned char PDataN[8][BUFSIZEN]; int RandData[BUFSIZEN]; int CntSwp = 0; int PcmWrPos = 0; /* const long TblChVol[16]= // n/15 n=0~15 { -10000,-2352,-1750,-1398,-1148,-954,-796,-662, -546,-444,-352,-269,-194,-124,-60,0 }; const long TblMainVol[4]= // 1,1/2,1/4,1/8 { 0,-602,-1204,-1806 }; */ //////////////////////////////////////////////////////////////////////////////// // seal audio specific //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// //HAC ws_audio_pcm_voice[4]; //HAC ws_audio_noise_voice; //HAC ws_audio_sweep_voice; //AUDIOWAVE ws_audio_pcm_wave[4]; //AUDIOWAVE ws_audio_noise_wave; //AUDIOWAVE ws_audio_sweep_wave; uint32_t ws_audio_channel_isPlaying[6]; static unsigned int ws_audio_log; //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_init(void) { fprintf(log_get(), "audio init\n"); fflush(log_get()); ws_audio_log = 0; //ws_audio_seal_init(); ws_audio_reset(); } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_reset(void) { WaveMap = -1; for (int i = 0 ; i < 6 ; i++) { ws_audio_stop_channel(i); ws_audio_play_channel(i); ws_audio_set_channel_frequency(i, 0); if (i != 4) { ws_audio_set_channel_pan(i, 0, 0); } ws_audio_clear_channel(i); } ws_audio_set_channel_frequency(4, 0); ws_audio_set_channel_frequency(4, 1792); } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_port_write(uint32_t port, uint8_t value) { uint32_t n, i, j, k, b; ws_ioRam[port] = value; switch (port) { case 0x48: if (value & 0x80) { n = (DMACH << 8) | DMACL; i = (DMASB << 16) | (DMASH << 8) | DMASL; j = (DMADH << 8) | DMADL; for (k = 0 ; k < n ; k++) { b = cpu_readmem20(i); cpu_writemem20(j, b); i++; j++; } n = 0; DMASB = (uint8_t)((i >> 16) & 0xFF); DMASH = (uint8_t)((i >> 8) & 0xFF); DMASL = (uint8_t)(i & 0xFF); DMADB = (uint8_t)((j >> 16) & 0xFF); DMADH = (uint8_t)((j >> 8) & 0xFF); DMADL = (uint8_t)(j & 0xFF); DMACH = (uint8_t)((n >> 8) & 0xFF); DMACL = (uint8_t)(n & 0xFF); value &= 0x7F; } break; case 0x80: case 0x81: i = (((unsigned int)ws_ioRam[0x81]) << 8) + ((unsigned int)ws_ioRam[0x80]); ws_audio_set_channel_frequency(0, i); break; case 0x82: case 0x83: i = (((unsigned int)ws_ioRam[0x83]) << 8) + ((unsigned int)ws_ioRam[0x82]); ws_audio_set_channel_frequency(1, i); break; case 0x84: case 0x85: i = (((unsigned int)ws_ioRam[0x85]) << 8) + ((unsigned int)ws_ioRam[0x84]); ws_audio_set_channel_frequency(2, i); break; case 0x86: case 0x87: i = (((unsigned int)(ws_ioRam[0x87] & 0x07)) << 8) + ((unsigned int)ws_ioRam[0x86]); ws_audio_set_channel_frequency(5, i); ws_audio_set_channel_frequency(3, i); break; case 0x88: ws_audio_set_channel_pan(0, (value & 0xF0) >> 4, value & 0x0F); break; case 0x89: ws_audio_set_channel_pan(1, (value & 0xF0) >> 4, value & 0x0F); break; case 0x8A: ws_audio_set_channel_pan(2, (value & 0xF0) >> 4, value & 0x0F); break; case 0x8B: ws_audio_set_channel_pan(5, (value & 0xF0) >> 4, value & 0x0F); ws_audio_set_channel_pan(3, (value & 0xF0) >> 4, value & 0x0F); break; case 0x8C: SwpStep = (signed char)value; break; case 0x8D: SwpTime = (((unsigned int)value) + 1) << 5; break; case 0x8E: if (value & 0x10) { ws_audio_set_channel_pdata(5, value & 0x07); } else { // hmmm.. shut up! } break; case 0x8F: WaveMap = ((unsigned int)value) << 6; break; case 0x90: if (value & 0x01) { ws_audio_play_channel(0); } else { ws_audio_stop_channel(0); } if ((value & 0x22) == 0x02) { ws_audio_play_channel(1); } else { ws_audio_stop_channel(1); } if (value & 0x04) { ws_audio_play_channel(2); } else { ws_audio_stop_channel(2); } if ((value & 0x88) == 0x08) { ws_audio_play_channel(3); } else { ws_audio_stop_channel(3); } if ((value & 0x88) == 0x88) { ws_audio_play_channel(5); } else { ws_audio_stop_channel(5); } break; case 0x91: value |= 0x80; HardVol = (value >> 1) & 0x3; ws_ioRam[port] = value; // Always have external speaker value = ws_ioRam[0x88]; ws_audio_set_channel_pan(0, (value & 0xF0) >> 4, value & 0x0F); value = ws_ioRam[0x89]; ws_audio_set_channel_pan(1, (value & 0xF0) >> 4, value & 0x0F); value = ws_ioRam[0x8A]; ws_audio_set_channel_pan(2, (value & 0xF0) >> 4, value & 0x0F); value = ws_ioRam[0x8B]; ws_audio_set_channel_pan(3, (value & 0xF0) >> 4, value & 0x0F); ws_audio_set_channel_pan(5, (value & 0xF0) >> 4, value & 0x0F); break; case 0x92: dbgprintf("0x92 <- 0x%2x\n", value); fflush(stdout); break; case 0x93: dbgprintf("0x93 <- 0x%2x\n", value); fflush(stdout); break; case 0x94: dbgprintf("0x94 <- 0x%2x\n", value); fflush(stdout); MainVol = (value & 0x0f) >> 2; value = ws_ioRam[0x88]; ws_audio_set_channel_pan(0, (value & 0xF0) >> 4, value & 0x0F); value = ws_ioRam[0x89]; ws_audio_set_channel_pan(1, (value & 0xF0) >> 4, value & 0x0F); value = ws_ioRam[0x8A]; ws_audio_set_channel_pan(2, (value & 0xF0) >> 4, value & 0x0F); value = ws_ioRam[0x8B]; ws_audio_set_channel_pan(3, (value & 0xF0) >> 4, value & 0x0F); ws_audio_set_channel_pan(5, (value & 0xF0) >> 4, value & 0x0F); break; case 0x9A: break; } } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// uint8_t ws_audio_port_read(uint8_t port) { return (ws_ioRam[port]); } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_done(void) { ws_audio_seal_done(); } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// unsigned int ws_audio_mrand(unsigned int Degree) { #define BIT(n) (1<N != Degree) { pTbl = TblMask; while (pTbl->N) { if (pTbl->N == Degree) { break; } pTbl++; } if (!pTbl->N) { pTbl--; } ShiftReg &= pTbl->InputBit - 1; if (!ShiftReg) { ShiftReg = pTbl->InputBit - 1; } } Masked = ShiftReg & pTbl->Mask; while (Masked) { XorReg ^= Masked & 0x01; Masked >>= 1; } if (XorReg) { ShiftReg |= pTbl->InputBit; } else { ShiftReg &= ~pTbl->InputBit; } ShiftReg >>= 1; return ShiftReg; } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// int ws_audio_seal_init(void) { #if 0 int i, j; AUDIOINFO info; AUDIOCAPS caps; uint32_t rc; uint32_t nDevId; fprintf(log_get(),"audio: using seal audio library\n"); /* initialize audio library */ AInitialize(); /* show registered device drivers */ fprintf(log_get(),"audio: registered sound devices:\n"); for (nDevId = 0; nDevId < AGetAudioNumDevs(); nDevId++) { AGetAudioDevCaps(nDevId, &caps); fprintf(log_get(),"audio: %2d. %s\n", nDevId, caps.szProductName); } /* open audio device */ info.nDeviceId = 0; info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO; // | AUDIO_MIXER_BASS; info.nSampleRate = 44100; if ((rc = AOpenAudio(&info)) != AUDIO_ERROR_NONE) { CHAR szText[80]; AGetErrorText(rc, szText, sizeof(szText) - 1); fprintf(log_get(),"audio: error: %s\n", szText); fflush(log_get()); return(0); } // open 6 voices ( 4 pcm, one noise, and one sweep) AOpenVoices(6); // create the 4 pcm channels for (i=0; i<4; i++) { // create the channel ACreateAudioVoice(&ws_audio_pcm_voice[i]); ASetVoiceVolume ( ws_audio_pcm_voice[i], AUDIO_MAX_VOLUME); ASetVoicePanning ( ws_audio_pcm_voice[i], AUDIO_MIN_PANNING); // create a looped sound buffer ws_audio_pcm_wave[i].nSampleRate = info.nSampleRate; ws_audio_pcm_wave[i].dwLength = BUFSIZE; ws_audio_pcm_wave[i].dwLoopStart = 0; ws_audio_pcm_wave[i].dwLoopEnd = ws_audio_pcm_wave[i].dwLength; ws_audio_pcm_wave[i].wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP; ACreateAudioData(&ws_audio_pcm_wave[i]); // channel is not playing yet ws_audio_channel_isPlaying[i]=0; // clear the channel ws_audio_clear_channel(i); } // create the noise channel { // create the channel ACreateAudioVoice(&ws_audio_noise_voice); ASetVoiceVolume ( ws_audio_noise_voice, AUDIO_MAX_VOLUME); ASetVoicePanning ( ws_audio_noise_voice, AUDIO_MAX_PANNING>>1); // create a looped sound buffer ws_audio_noise_wave.nSampleRate = info.nSampleRate; ws_audio_noise_wave.dwLength = (BUFSIZEP<<4); ws_audio_noise_wave.dwLoopStart = 0; ws_audio_noise_wave.dwLoopEnd = ws_audio_noise_wave.dwLength; ws_audio_noise_wave.wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP; ACreateAudioData(&ws_audio_noise_wave); // channel is not playing yet ws_audio_channel_isPlaying[4]=0; // clear the channel ws_audio_clear_channel(4); } // create the sweep channel { // create the channel ACreateAudioVoice(&ws_audio_sweep_voice); ASetVoiceVolume ( ws_audio_sweep_voice, AUDIO_MAX_VOLUME); ASetVoicePanning ( ws_audio_sweep_voice, AUDIO_MAX_PANNING); // create a looped sound buffer ws_audio_sweep_wave.nSampleRate = info.nSampleRate; ws_audio_sweep_wave.dwLength = BUFSIZEN; ws_audio_sweep_wave.dwLoopStart = 0; ws_audio_sweep_wave.dwLoopEnd = ws_audio_sweep_wave.dwLength; ws_audio_sweep_wave.wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP; ACreateAudioData(&ws_audio_sweep_wave); // channel is not playing yet ws_audio_channel_isPlaying[5]=0; // clear the channel ws_audio_clear_channel(5); } // initialize the noise channel data int rand; for(i=0; i<8; i++) { for(j=0; jBPSMAX) { Freq=BPSMAX; } else if(FreqRight) { ws_audio_set_channel_volume(Channel,Left); } else { ws_audio_set_channel_volume(Channel,Right); } pan=TblPan[Left][Right]; if(ChCurPan[Channel]==pan) { return; } ChCurPan[Channel]=pan; if (pan>10000) { pan=10000; } pan=((pan+10000)*AUDIO_MAX_PANNING)/20000; if (Channel==5) { ASetVoicePanning(ws_audio_sweep_voice,pan); } else if (Channel==4) { ASetVoicePanning(ws_audio_noise_voice,pan); } else { ASetVoicePanning(ws_audio_pcm_voice[Channel],pan); } #endif } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_set_channel_pdata(int Channel, int Index) { #if 0 unsigned char *pData; if(Channel==5) { pData=PDataN[Index]; memcpy(ws_audio_sweep_wave.lpData, pData, ws_audio_sweep_wave.dwLength); AWriteAudioData(&ws_audio_sweep_wave, 0, ws_audio_sweep_wave.dwLength); } else if(Channel==4) { pData=PDataP; memcpy(ws_audio_noise_wave.lpData, pData, ws_audio_noise_wave.dwLength); AWriteAudioData(&ws_audio_noise_wave, 0, ws_audio_noise_wave.dwLength); } else { pData=PData[Channel]; memcpy(ws_audio_pcm_wave[Channel].lpData, pData, ws_audio_pcm_wave[Channel].dwLength); AWriteAudioData(&ws_audio_pcm_wave[Channel], 0, ws_audio_pcm_wave[Channel].dwLength); } #endif } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_set_channels_pbuf(int Addr, int Data) { #if 0 int i,j; i=(Addr&0x30)>>4; for(j=(Addr&0x0F)<<1; j>4)&0x0f)*17-128; } if((Addr&0x0F)==0x0F) { ws_audio_set_channel_pdata(i,0); } #endif } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_rst_channel(int Channel) { #if 0 if(Channel==2) { ws_audio_set_channel_frequency(2,ChPerInit); SwpCurPeriod=ChPerInit; } #endif } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// int ws_audio_int(void) { #if 0 unsigned int value; static int i; if((SwpStep)&&(SNDMOD&0x40)) { if(CntSwp<0) { CntSwp=SwpTime; SwpCurPeriod+=SwpStep; SwpCurPeriod&=0x7FF; value=3072000/(2048-SwpCurPeriod); if(value>100000) { value=100000; ws_audio_set_channel_volume(2,0); } if(value<100) { value=100; } ASetVoiceFrequency(ws_audio_pcm_voice[2],value); } CntSwp--; } i++; if(i>=BUFSIZEN) { i=0; } return RandData[i]; #endif return 1; } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// #if 0 static uint32_t PCMPos=0; uint32_t TickZ=0,PcmCount; #endif void ws_audio_set_pcm(int Data) { #if 0 uint32_t tick; PDataP[PCMPos++]=(unsigned char)(Data+128); tick=SDL_GetTicks(); PcmCount++; if(tick>=TickZ) { TickZ=tick+125; PcmCount<<=3; if(PcmCount>=10000) { PcmCount=12000; } ASetVoiceFrequency(ws_audio_noise_voice,PcmCount); PcmCount=0; } if(PCMPos>=BUFSIZEP) { ws_audio_flash_pcm(); } #endif } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_flash_pcm(void) { #if 0 uint32_t len1; const uint32_t WrPos[16]= { BUFSIZEP*0,BUFSIZEP*1,BUFSIZEP*2,BUFSIZEP*3, BUFSIZEP*4,BUFSIZEP*5,BUFSIZEP*6,BUFSIZEP*7, BUFSIZEP*8,BUFSIZEP*9,BUFSIZEP*10,BUFSIZEP*11, BUFSIZEP*12,BUFSIZEP*13,BUFSIZEP*14,BUFSIZEP*15, }; len1=BUFSIZEP; if (ws_audio_noise_wave.lpData == NULL) { return; } memcpy(&ws_audio_noise_wave.lpData[WrPos[PcmWrPos]], PDataP, len1); AWriteAudioData(&ws_audio_noise_wave, 0, ws_audio_noise_wave.dwLength); PcmWrPos++; PcmWrPos&=0xF; memset(PDataP,PL,sizeof(PDataP)); PCMPos=0; #endif } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_write_byte(uint32_t offset, uint8_t value) { if (!((offset - WaveMap) & 0xFFC0)) { ws_audio_set_channels_pbuf(offset & 0x003F, value); internalRam[offset] = value; } } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_process(void) { uint32_t i, j, b; i = ws_audio_int(); PCSRL = (uint8_t)(i & 0xFF); PCSRH = (uint8_t)((i >> 8) & 0xFF); if ((SDMACTL & 0x88) == 0x80) { i = (SDMACH << 8) | SDMACL; j = (SDMASB << 16) | (SDMASH << 8) | SDMASL; b = cpu_readmem20(j); if (!ws_audio_channel_isPlaying[5]) { b = 0x80; } ws_ioRam[0x89] = b; i--; j++; if (i < 32) { i = 0; SDMACTL &= 0x7F; } SDMASB = (uint8_t)((j >> 16) & 0xFF); SDMASH = (uint8_t)((j >> 8) & 0xFF); SDMASL = (uint8_t)(j & 0xFF); SDMACH = (uint8_t)((i >> 8) & 0xFF); SDMACL = (uint8_t)(i & 0xFF); } else if ((SNDMOD & 0x22) == 0x22) { b = ws_ioRam[0x89]; if (!ws_audio_channel_isPlaying[4]) { b = 0x80; } } else { b = 0x80; } b >>= 1; b += 0x40; if (b > 0xAA) { b = 0xAA; } else if (b < 0x55) { b = 0x55; } ws_audio_set_pcm(b); } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_readState(int fp) { #if 0 long lpdwPosition; long lpdwFrequency; unsigned int lpnVolume; unsigned int lpnPanning; int lpnStatus; unsigned char *pData; read(fp,&PCMPos,sizeof(uint32_t)); read(fp,&TickZ,sizeof(uint32_t)); read(fp,&PcmCount,sizeof(uint32_t)); read(fp,&WaveMap,sizeof(int)); read(fp,&ChPerInit,sizeof(int)); read(fp,&SwpTime,sizeof(int)); read(fp,&SwpStep,sizeof(int)); read(fp,&SwpCurPeriod,sizeof(int)); read(fp,&MainVol,sizeof(int)); read(fp,&CntSwp,sizeof(int)); read(fp,&PcmWrPos,sizeof(int)); read(fp,ws_audio_channel_isPlaying,sizeof(uint32_t)*6); read(fp,PData,sizeof(unsigned char)*4*BUFSIZE); read(fp,PDataP,sizeof(unsigned char)*(BUFSIZEP<<4)); read(fp,PDataN,sizeof(unsigned char)*8*BUFSIZEN); read(fp,PDataN,sizeof(int)*BUFSIZEN); for (int i=0; i<4; i++) { read(fp,&lpdwPosition,sizeof(long)); read(fp,&lpdwFrequency,sizeof(long)); read(fp,&lpnVolume,sizeof(unsigned int)); read(fp,&lpnPanning,sizeof(unsigned int)); read(fp,&lpnStatus,sizeof(int)); ASetVoicePosition(ws_audio_pcm_voice[i],lpdwPosition); ASetVoiceFrequency(ws_audio_pcm_voice[i], lpdwFrequency); ASetVoiceVolume(ws_audio_pcm_voice[i], lpnVolume); ASetVoicePanning(ws_audio_pcm_voice[i], lpnPanning); pData=PData[i]; memcpy(ws_audio_pcm_wave[i].lpData, pData, ws_audio_pcm_wave[i].dwLength); AWriteAudioData(&ws_audio_pcm_wave[i], 0, ws_audio_pcm_wave[i].dwLength); if (ws_audio_channel_isPlaying[i]) { APlayVoice(ws_audio_pcm_voice[i], &ws_audio_pcm_wave[i]); } } ASetVoicePosition(ws_audio_noise_voice,lpdwPosition); ASetVoiceFrequency(ws_audio_noise_voice, lpdwFrequency); ASetVoiceVolume(ws_audio_noise_voice, lpnVolume); ASetVoicePanning(ws_audio_noise_voice, lpnPanning); pData=PDataP; memcpy(ws_audio_noise_wave.lpData, pData, ws_audio_noise_wave.dwLength); AWriteAudioData(&ws_audio_noise_wave, 0, ws_audio_noise_wave.dwLength); if (ws_audio_channel_isPlaying[4]) { APlayVoice(ws_audio_noise_voice, &ws_audio_noise_wave); } read(fp,&lpdwPosition,sizeof(long)); read(fp,&lpdwFrequency,sizeof(long)); read(fp,&lpnVolume,sizeof(unsigned int)); read(fp,&lpnPanning,sizeof(unsigned int)); read(fp,&lpnStatus,sizeof(int)); ASetVoicePosition(ws_audio_sweep_voice,lpdwPosition); ASetVoiceFrequency(ws_audio_sweep_voice, lpdwFrequency); ASetVoiceVolume(ws_audio_sweep_voice, lpnVolume); ASetVoicePanning(ws_audio_sweep_voice, lpnPanning); pData=PDataN[0]; memcpy(ws_audio_sweep_wave.lpData, pData, ws_audio_sweep_wave.dwLength); AWriteAudioData(&ws_audio_sweep_wave, 0, ws_audio_sweep_wave.dwLength); if (ws_audio_channel_isPlaying[5]) { APlayVoice(ws_audio_sweep_voice, &ws_audio_sweep_wave); } read(fp,&lpdwPosition,sizeof(long)); read(fp,&lpdwFrequency,sizeof(long)); read(fp,&lpnVolume,sizeof(unsigned int)); read(fp,&lpnPanning,sizeof(unsigned int)); read(fp,&lpnStatus,sizeof(int)); #endif } //////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// // // // // // // // //////////////////////////////////////////////////////////////////////////////// void ws_audio_writeState(int fp) { #if 0 int32_t lpdwPosition; int32_t lpdwFrequency; uint16_t lpnVolume; uint16_t lpnPanning; int8_t lpnStatus; write(fp,&PCMPos,sizeof(uint32_t)); write(fp,&TickZ,sizeof(uint32_t)); write(fp,&PcmCount,sizeof(uint32_t)); write(fp,&WaveMap,sizeof(int)); write(fp,&ChPerInit,sizeof(int)); write(fp,&SwpTime,sizeof(int)); write(fp,&SwpStep,sizeof(int)); write(fp,&SwpCurPeriod,sizeof(int)); write(fp,&MainVol,sizeof(int)); write(fp,&CntSwp,sizeof(int)); write(fp,&PcmWrPos,sizeof(int)); write(fp,ws_audio_channel_isPlaying,sizeof(uint32_t)*6); write(fp,PData,sizeof(unsigned char)*4*BUFSIZE); write(fp,PDataP,sizeof(unsigned char)*(BUFSIZEP<<4)); write(fp,PDataN,sizeof(unsigned char)*8*BUFSIZEN); write(fp,PDataN,sizeof(int)*BUFSIZEN); for (int i=0; i<4; i++) { AGetVoicePosition(ws_audio_pcm_voice[i],&lpdwPosition); AGetVoiceFrequency(ws_audio_pcm_voice[i], &lpdwFrequency); AGetVoiceVolume(ws_audio_pcm_voice[i], &lpnVolume); AGetVoicePanning(ws_audio_pcm_voice[i], &lpnPanning); AGetVoiceStatus(ws_audio_pcm_voice[i], &lpnStatus); write(fp,&lpdwPosition,sizeof(long)); write(fp,&lpdwFrequency,sizeof(long)); write(fp,&lpnVolume,sizeof(unsigned int)); write(fp,&lpnPanning,sizeof(unsigned int)); write(fp,&lpnStatus,sizeof(int)); } AGetVoicePosition(ws_audio_noise_voice,&lpdwPosition); AGetVoiceFrequency(ws_audio_noise_voice, &lpdwFrequency); AGetVoiceVolume(ws_audio_noise_voice, &lpnVolume); AGetVoicePanning(ws_audio_noise_voice, &lpnPanning); AGetVoiceStatus(ws_audio_noise_voice, &lpnStatus); write(fp,&lpdwPosition,sizeof(long)); write(fp,&lpdwFrequency,sizeof(long)); write(fp,&lpnVolume,sizeof(unsigned int)); write(fp,&lpnPanning,sizeof(unsigned int)); write(fp,&lpnStatus,sizeof(int)); AGetVoicePosition(ws_audio_sweep_voice,&lpdwPosition); AGetVoiceFrequency(ws_audio_sweep_voice, &lpdwFrequency); AGetVoiceVolume(ws_audio_sweep_voice, &lpnVolume); AGetVoicePanning(ws_audio_sweep_voice, &lpnPanning); AGetVoiceStatus(ws_audio_sweep_voice, &lpnStatus); write(fp,&lpdwPosition,sizeof(long)); write(fp,&lpdwFrequency,sizeof(long)); write(fp,&lpnVolume,sizeof(unsigned int)); write(fp,&lpnPanning,sizeof(unsigned int)); write(fp,&lpnStatus,sizeof(int)); #endif }