📄 maphrcnv.c
字号:
(gApiInfo[bSlave].slave == 0) && /* Not have slaves */
(pMaster->dwPlayTime == pSlave->dwPlayTime)) /* same playtime */
{
gApiInfo[bSlave].master_channel = phr_id;
gApiInfo[phr_id].slave |= (UINT32)(1L << bSlave);
MAPHRCNV_DBGMSG(("Successful : Register bind[%02X %08lX] \n",
gApiInfo[bSlave].master_channel,gApiInfo[phr_id].slave));
} else if(gApiInfo[bSlave].master_channel == phr_id) {
MAPHRCNV_DBGMSG(("Successful : Already bind[%08lX] \n", bSlave));
} else {
MAPHRCNV_DBGMSG(("Error : Register bind \n"));
return (MASMW_ERROR);
}
}
/* Cancel bind */
else {
MAPHRCNV_DBGMSG(("Cancel bind [%08lX] \n", gApiInfo[phr_id].slave));
for(i = 0; i < MAX_PHRASE_CHANNEL; i++) {
if(gApiInfo[phr_id].slave & (UINT32)(0x01 << i)) {
if(gApiInfo[i].status != ID_STATUS_READY) return (MASMW_ERROR);
}
}
for(i = 0; i < MAX_PHRASE_CHANNEL; i++) {
if(gApiInfo[phr_id].slave & (UINT32)(0x01 << i)) {
gApiInfo[i].master_channel = -1;
}
}
gApiInfo[phr_id].slave = 0L;
}
return (MASMW_SUCCESS);
}
/***** Phrase Wrapper - static ***********************************************/
/*==============================================================================
// void InitApiInfo(int ch)
//
// description : Initialize APIINFO
//
// argument : ch ... channel(0..3)
//
// return :
//
//============================================================================*/
static void InitApiInfo(int ch)
{
PAPIINFO pAi;
if((ch < 0) || (MAX_PHRASE_DATA <= ch)) return;
pAi = &(gApiInfo[ch]);
pAi->status = ID_STATUS_NODATA;
pAi->file_id = -1L;
pAi->vol = 100;
pAi->pan = 64;
pAi->loop = 0;
pAi->master_channel = -1;
pAi->slave = 0L;
pAi->length = 0L;
pAi->pos = 0L;
if (ch == 4)
pAi->gdwRamAddr = 0xFFFFFFFF;
else {
if (gPhrRamSize != 0)
pAi->gdwRamAddr = (UINT32)(gPhrRamAdrs + (0x400 * ch));
else
pAi->gdwRamAddr = 0xFFFFFFFF;
}
}
/*==============================================================================
// UINT32 SetMasterChannel(int ch, int master_channel)
//
// description : set master channel
//
// argument : ch ... channel(0..3)
// master_channel ... channel(0..3)
//
// return :
//============================================================================*/
static UINT32 SetMasterChannel(int ch, int master_channel)
{
if(gdwSlave & (0x01 << ch)) return(1L);
if(gApiInfo[ch].slave != 0L) return(1L);
gApiInfo[ch].master_channel = master_channel;
gdwSlave |= (UINT32)(1L << ch);
return (0L);
}
/*==============================================================================
// SINT32 CallBack(int ch, UINT8 id)
//
// description :
//
// argument : ch ... channel(0..3)
// id ... event
//
// return :
// 0 meanes no error.
//============================================================================*/
static SINT32 CallBack(int ch, UINT8 id)
{
struct event eve;
/*--- check channel ----------------------------------------------------*/
if((ch < 0) || (MAX_PHRASE_CHANNEL <= ch)) return (SINT32)(-1L);
eve.ch = ch;
eve.mode = 0x80;
switch(id)
{
case 0x7F :
gApiInfo[ch].status = ID_STATUS_READY;
eve.mode = -0x01;
break;
case 0x7E :
eve.mode = -0x02;
break;
case 0x00 :
case 0x01 :
case 0x02 :
case 0x03 :
case 0x04 :
case 0x05 :
case 0x06 :
case 0x07 :
case 0x08 :
case 0x09 :
case 0x0A :
case 0x0B :
case 0x0C :
case 0x0D :
case 0x0E :
case 0x0F :
eve.mode = (int)id;
break;
}
if((eve.mode != 0x80) && (gEvHandler != NULL)) {
gEvHandler(&eve);
}
return (0L);
}
/*==============================================================================
// SINT32 CallBack_Service1(UINT8 id)
//
// description :
//
// argument : id ... event
//
// return :
// 0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service1(UINT8 id)
{
return (CallBack(0, id));
}
/*==============================================================================
// SINT32 CallBack_Service2(UINT8 id)
//
// description :
//
// argument : id ... event
//
// return :
// 0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service2(UINT8 id)
{
return (CallBack(1, id));
}
/*==============================================================================
// SINT32 CallBack_Service3(UINT8 id)
//
// description :
//
// argument : id ... event
//
// return :
// 0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service3(UINT8 id)
{
return (CallBack(2, id));
}
/*==============================================================================
// SINT32 CallBack_Service4(UINT8 id)
//
// description :
//
// argument : id ... event
//
// return :
// 0 meanes no error.
//============================================================================*/
static SINT32 CallBack_Service4(UINT8 id)
{
return (CallBack(3, id));
}
/***** Common Function *******************************************************/
/*==============================================================================
// int ResourceCreate(void)
//
// description : call MaSndDrv_Create().
//
// argument :
//
// return :
// 0 meanes no error.
//============================================================================*/
static SINT32 ResourceCreate(void)
{
UINT32 Ram;
UINT32 Size;
gdwPhrId = MaSndDrv_Create( (UINT8)1,
(UINT8)PHRASE_TIMEBASE, /* 20msec */
(UINT8)0x15, /* Durum setting ... MA-1/2 Compatible mode */
/* DVA setting ... Compulsion mono mode */
/* Melody setting ... Standard mode */
(UINT8)16, /* Resource mode */
(UINT8)0, /* Number of Streams */
MaPhrCnv_Convert, /* Call back function */
&gPhrRamAdrs, /* Starting sddress of RAM */
&gPhrRamSize); /* Size of RAM */
if (gdwPhrId < 0L) {
gdwPhrId = -1L;
gPhrRamAdrs = 0xFFFFFFFF;
gPhrRamSize = 0;
return (-1);
}
gSeqID = MaSndDrv_Create(
(UINT8)MASMW_SEQTYPE_AUDIO, /* AudioMode */
(UINT8)MASMW_AUDIO_BASETIME, /* Timer Setting */
(UINT8)0, /* Option : --- */
(UINT8)1, /* ResMode */
(UINT8)1, /* Num of Stream */
MaAudCnv_Convert, /* Callback Fn */
&Ram, /* Top Address of Reseved RAM */
&Size); /* Size of Reserved RAM */
if (gSeqID < 0L) {
MaSndDrv_Free(gdwPhrId);
gdwPhrId = -1L;
gSeqID = -1L;
gPhrRamAdrs = 0xFFFFFFFF;
gPhrRamSize = 0;
return (-1);
}
MAPHRCNV_DBGMSG((" ResourceCreate [%d %d]\n", gdwPhrId, gSeqID));
return (0);
}
/*==============================================================================
// int ResourceFree(void)
//
// description : call MaSndDrv_Free().
//
// argument :
//
// return :
// 0 meanes no error.
//============================================================================*/
static SINT32 ResourceFree(void)
{
MaSndDrv_Free(gdwPhrId);
gdwPhrId = -1L;
MaSndDrv_Free(gSeqID);
gSeqID = -1L;
gPhrRamAdrs = 0xFFFFFFFF;
gPhrRamSize = 0;
return (0);
}
/***** Phrase Wrapper - API **************************************************/
/*==============================================================================
// int Phrase_Initialize(void)
//
// description : Initialize SMAF/Phrase Sequencer.
//
// argument :
//
// return :
// 0 meanes no error.
//============================================================================*/
int Phrase_Initialize(void)
{
int ch;
UINT8 i;
MAPHRCNV_DBGMSG(("Phrase_Initialize\n"));
/*--- check SMAF/Phrase stream converter ID ----------------------------*/
if (gbCreateStatus & MASK_STATUS_PHRASE) return (-1);
/*--- MA-3 Sequence Create ---------------------------------------------*/
if (gbCreateStatus == 0) {
if (ResourceCreate() < 0L) {
return (-1);
}
}
gbCreateStatus |= MASK_STATUS_PHRASE;
/*--- Initialize global values -----------------------------------------*/
gbPlayStatus = 0x00;
gbPauseStatus = 0x00;
gdwCtrlStatus = CTRL_CLEAR_ALL;
gdwPhrStatus = 0;
for(ch = 0; ch < MAX_PHRASE_DATA; ch++) {
InitApiInfo(ch);
}
for(i = 0; i < MASMW_NUM_CHANNEL; i++) {
InitChInfo(i);
}
gEvHandler = NULL;
gdwSlave = 0L;
/* set System On & Master Volume */
gdwCtrlStatus |= (CTRL_SYSTEM_ON | CTRL_MASTER_VOLUME);
MaSndDrv_SetVolume(gdwPhrId, 0x7F);
return (0);
}
/*==============================================================================
// int Phrase_GetInfo(struct info* dat)
//
// description : Get device information.
//
// argument : dat ... pointer to device information
//
// return :
// 0 meanes no error.
//============================================================================*/
int Phrase_GetInfo(struct info* dat)
{
MAPHRCNV_DBGMSG(("Phrase_GetInfo[0x%X] \n", dat));
if(dat == NULL) return (-1);
dat->MakerID = 0x00430000; /* YAMAHA */
dat->DeviceID = 0x06; /* MA-3 */
dat->VersionID = 1;
dat->MaxVoice = 4;
dat->MaxChannel = 4;
dat->SupportSMAF = 0x01; /* SMAF/Phrase ver1 */
dat->Latency = (long)(20 * 1000); /* 20msec */
return (0);
}
/*==============================================================================
// int Phrase_CheckData(unsigned char* data, unsigned long len)
//
// description : Check SMAF/Phrase data.
//
// argument : data ... pointer to data.
// len ... the size of data(in byte).
//
// return :
// 0 meanes no error.
//============================================================================*/
int Phrase_CheckData(UINT8* data, UINT32 len)
{
MAPHRCNV_DBGMSG(("Phrase_CheckData [0x%X 0x%X] \n", data, len));
/*--- check SMAF/Phrase stream converter ID ----------------------------*/
if(!(gbCreateStatus & MASK_STATUS_PHRASE) || (gdwPhrId == -1L)) return (-1);
/*--- check arugment ---------------------------------------------------*/
if((data == NULL) || (len == 0L)) return (-1);
/*--- check data -------------------------------------------------------*/
if(MaPhr_Load(MAX_PHRASE_CHANNEL, (UINT8*)data, (UINT32)len, 2, NULL, NULL) < 0L)
return (-1);
return (0);
}
/*==============================================================================
// int Phrase_SetData(int ch, unsigned char* data, unsigned long len, int check)
//
// description : Check SMAF/Phrase data.
//
// argument : ch ... channel(0..3)
// data ... pointer to data.
// len ... the size of data(in byte).
// check ... error check enable(1) or disable(0)
//
// return :
// 0 meanes no error.
//============================================================================*/
int Phrase_SetData(int ch, unsigned char* data, unsigned long len, int check)
{
MAPHRCNV_DBGMSG(("Phrase_SetData [%d 0x%X 0x%X %d] \n", ch, data, len, check));
/*--- check SMAF/Phrase stream converter ID ----------------------------*/
if(!(gbCreateStatus & MASK_STATUS_PHRASE) || (gdwPhrId == -1L)) return (-1);
/*--- check channel ----------------------------------------------------*/
if((ch < 0) || (MAX_PHRASE_CHANNEL <= ch)) return (-1);
/*--- check arugment ---------------------------------------------------*/
if((data == NULL) || (len == 0L)) return (-1);
/*--- check status (Is status NODATA?) ---------------------------------*/
if(gApiInfo[ch].status != ID_STATUS_NODATA) return (-1);
/*--- check data -------------------------------------------------------*/
if (MaPhr_Load((
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -