#include "sega_pcm.h"
#include "sega_snd.h"
...
#define RING_BUF_SIZE (2048L*10)
#define PCM_ADDR ((void*)0x25a20000)
#define PCM_SIZE (4096L*2)
Sint8 *g_movie_buf = (Sint8 *)0x25a20000;
PcmHn pcm;
int delta;
int frame;
...
void UsrVblankIn( void )
{
PCM_MeVblIn();
}
static void sndInit(void)
{
SndIniDt snd_init;
char sound_map[]={0xFF,0xFF};
#ifndef ACTION_REPLAY
GFS_Load(GFS_NameToId(SDDRV_NAME),0,(void *) SDDRV_ADDR,SDDRV_SIZE);
SND_INI_PRG_ADR(snd_init) = (Uint16 *)SDDRV_ADDR;
SND_INI_PRG_SZ(snd_init) = (Uint16) SDDRV_SIZE;
#else
SND_INI_PRG_ADR(snd_init) = (Uint16 *)snddrv;
SND_INI_PRG_SZ(snd_init) = (Uint16) sizeof(snddrv);
#endif
SND_INI_ARA_ADR(snd_init) = (Uint16 *)sound_map;
SND_INI_ARA_SZ(snd_init) = (Uint16)sizeof(sound_map);
SND_Init(&snd_init);
SND_ChgMap(0);
}
static PcmHn createHandle(PcmCreatePara *para)
{
PcmHn pcm;
pcm = PCM_CreateMemHandle(para);
if (pcm == NULL) {
return NULL;
}
PCM_NotifyWriteSize(pcm, 7680*2);
return pcm;
}
void main()
{
delta=0;
frame=0;
sndInit();
PCM_MeInit();
PcmCreatePara para;
PcmInfo info;
PcmStatus *st;
static PcmWork g_movie_work;
PCM_PARA_WORK(¶) = (struct PcmWork *)&g_movie_work;
PCM_PARA_RING_ADDR(¶) = (Sint8 *)g_movie_buf;
PCM_PARA_RING_SIZE(¶) = RING_BUF_SIZE;
PCM_PARA_PCM_ADDR(¶) = PCM_ADDR;
PCM_PARA_PCM_SIZE(¶) = PCM_SIZE;
st = &g_movie_work.status;
memset((Sint8 *)g_movie_buf,0,7680L*4);
st->need_ci = PCM_ON;
PCM_INFO_FILE_TYPE(&info) = PCM_FILE_TYPE_NO_HEADER;
PCM_INFO_DATA_TYPE(&info)=PCM_DATA_TYPE_RLRLRL;//PCM_DATA_TYPE_LRLRLR;
PCM_INFO_FILE_SIZE(&info) = 7680L*2;
PCM_INFO_CHANNEL(&info) = 0x01;
PCM_INFO_SAMPLING_BIT(&info) = 16;
PCM_INFO_SAMPLING_RATE(&info) = 7680L;
PCM_INFO_SAMPLE_FILE(&info) = 7680L*2;
pcm = createHandle(¶);
PCM_SetPcmStreamNo(pcm, 0);
PCM_SetInfo(pcm, &info);
PCM_ChangePcmPara(pcm);
PCM_MeSetLoop(pcm, 7680L);
if (pcm == NULL) {
return;
}
PCM_Start(pcm);
while(1)
{
SN76496Update(&g_movie_buf[delta],128);
delta+=256;
frame++;
if(frame==60)
{
frame=0;
delta=0;
}
PCM_Task(pcm);
}
}