示例#1
0
/***********************************************************************
函数功能:创建一个子空文件
操作内容:1、文件名必须是数字或者大写字母,小于8位则用空格,扩展名为空格 
          2、文件大小事先不用设置,均为0;
          3、创建子文件的过程实际就是写子目录和FAT表,这里不写文件里的数据
          4、这里文件名为短名,8个字节,也就是8个字符
          5、子文件的目录写在其父目录的起始簇的空白目录项
***********************************************************************/
void CreateDirectoryFile(uint8 DirectoryName[11], uint8 FileName[11])  //父文件夹名和新建文件名,短文件名
{
	uint16 ClusID,ClusIDFile,Index;
        DIR FileDir;
        uint16 FileCrtDateTmp,FileCrtTimeTmp;                 //双字节数据       
        uint8 FileCrtDate[2],FileCrtTime[2];                  //单字节时间日期数据
 
	FileDir.FilePosit.Start = GetNextFAT();               //得到一个空的FAT项,下面用来写对应文件的FAT表       
	ClusID = FileDir.FilePosit.Start;                     //文件簇开始簇号,这是子文件的起始簇地址
        ClusIDFile = FileDir.FilePosit.Start;                 //暂存下来,以备后面写入

	WriteFAT(ClusID, 0xffff);                             //写对应文件的FAT表1,即FAT1,0xffff表示文件结束
        WriteFAT2(ClusID, 0xffff);                            //写对应文件的FAT表2,即FAT2,0xffff表示文件结束     
                             
        Index = GetFileID(DirectoryName,&FileDir);            //搜索得到文件夹的属性,主要是获得起始簇位置,方便写文件的目录项
        ReadDIR(Index, &FileDir);                             //读取父文件夹的目录项,只需要其起始簇
        
        FileCrtDateTmp=GetFileCrtDate(2010,7,2);              //文件修改日期2010年7月2日
        FileCrtDate[0]=(uint8)FileCrtDateTmp&0x00ff;          //低字节提取
        FileCrtDate[1]=(uint8)(FileCrtDateTmp>>8);            //高字节提取       
        FileCrtTimeTmp=GetFileCrtTime(21,20,10);              //文件修改时间21点20分10秒
        FileCrtTime[0]=(uint8)FileCrtTimeTmp&0x00ff;          //低字节提取
        FileCrtTime[1]=(uint8)(FileCrtTimeTmp>>8);            //高字节提取      
        
        CopyBytes(FileName, &FileDir.FileName, 11);           //写入文件名
        
        CopyBytes(FileCrtDate, &FileDir.FileCrtDate, 2);       //写入文件创建日期
        CopyBytes(FileCrtTime, &FileDir.FileCrtTime, 2);       //写入文件创建时间
        
        FileDir.FileAttrib = 0x20;                             //文件属性填充,0x10为子目录属性,即文件夹       
       
        ClusID = FileDir.FilePosit.Start;                      //父文件夹的开始簇号,子文件目录项写入这个簇中
        FileDir.FilePosit.Start=ClusIDFile;                    //新建文件的起始簇
        WriteDirectoryDIR(ClusID,GetDirectoryEmptyDIR(ClusID),&FileDir);//需要扫描父目录的起始簇中空白可以写入子目录的项
        
}
示例#2
0
int main(int _argc, char **_argv)
{
    consoleDemoInit();
    InstallSoundSys();

    argc=_argc;
    argv=_argv;
    if(!fatInitDefault())
    {
        iprintf("Filesystem FAIL");
        for(;;) swiWaitForVBlank();
    }

    CurrentFile = 0;

    ReadDIR();
    ShowDIR();

    CurrentSPS=malloc(768);
    if(readFrontend(CurrentSPS)) {
        ReadSPS();
    } else {
        free(CurrentSPS);
        CurrentSPS=NULL;
    }

    for(;;)
    {
        if(CurrentSSEQ != LastSSEQ)
        {
            LastSSEQ = CurrentSSEQ;
            scrollpos = 0;
            scrollposcounter = 10;
        }
        if(CurrentFile != LastFile)
        {
            LastFile = CurrentFile;
            scrollpos = 0;
            scrollposcounter = 10;
        }

        if(scrollposcounter==0)
        {
            scrollposcounter=10;
            if(!scrollposdirection)
            {
                //RIGHT
                if(scrollpos<scrollposmax)
                {
                    scrollpos++;
                }
                else
                {
                    scrollposdirection = 1;
                    scrollposcounter = 120;
                }
            }
            else
            {
                //LEFT
                if(scrollpos>0)
                {
                    scrollpos--;
                }
                else
                {
                    scrollposdirection = 0;
                    scrollposcounter = 120;
                }
            }
        }
        else
        {
            scrollposcounter--;
        }
        if(!PlayMode)
        {
            message_pointer = 0;	//Ignore any incoming debug messages.
            if(SSEQMode)
                ShowSSEQ();
            else
                ShowDIR();
        }
        swiWaitForVBlank();
        if(PlayMode)
        {
            j = message_pointer;
            for(i=0; i<j; i+=6)
            {
                if(message_data[i])
                {
#ifdef SNDSYS_DEBUG
                    iprintf("cmd = %.2X:%.2X",message_data[i+1],message_data[i+2]);
                    if(message_data[i]==3)
                        iprintf(":%.2X\n",message_data[i+3]);
                    else
                        iprintf("\n");
#endif
                    switch (message_data[i+1])
                    {
#ifdef SNDSYS_DEBUG
                    case 0x00:
                        iprintf("00 Unrecognized record: %d\n",message_data[i+2]);
                        break;
                    case 0x04:
                        iprintf("%X:",message_data[i+5]);
                        iprintf("04 SEQUENCE IS MULTI-TRACK\n");
                        break;
                    case 0x03:
                        iprintf("%X:",message_data[i+5]);
                        iprintf("03 SEQUENCE IS SINGLE-TRACK\n");
                        break;
                    case 0x05:
                        iprintf("%X:",message_data[i+5]);
                        iprintf("05 CREATED TRACK %d\n",message_data[i+2]);
                        break;
#endif
                    case 0x06:
                        if(PlayMode)
                            iprintf("06 SEQUENCE STOPPED\n");
                        if(PlayMode && AutoPlay && !ManualStop)
                        {
                            if(CurrentSSEQ < SSEQCount - 1)
                            {
                                CurrentSSEQ++;
                                ReadSSEQ();
                            }

                        }
                        ManualStop = false;
                        break;
                    case 0x07:
                        if(PlayMode)
                            iprintf("07 Track has looped twice\n");
                        if(PlayMode && AutoPlay)
                        {
                            FadeSeq();
                        }
                        break;
                    case 0x08:
                        if(PlayMode)
                            iprintf("08 Track has ended\n");
                        if(PlayMode && AutoPlay)
                        {
                            if(CurrentSSEQ < SSEQCount - 1)
                            {
                                CurrentSSEQ++;
                                ReadSSEQ();
                            }
                        }
                        break;

                    case 0xC1: // Track Volume
                        iprintf("%X:", message_data[i+5]);
                        iprintf("C1     Track Volume: %d\n", message_data[i+2]);
                        break;

                    case 0xC2: // MASTER VOLUME
                        iprintf("%X:", message_data[i+5]);
                        iprintf("C2    MASTER VOLUME: %d\n", message_data[i+2]);
                        break;

#ifdef SNDSYS_DEBUG
                    case 0x94: // JUMP
                        iprintf("%X:",message_data[i+5]);
                        iprintf("94     POSITION JUMP:\n");
                        break;
                    case 0xC3: // TRANSPOSE
                        iprintf("C3         TRANSPOSE: %.2X\n",message_data[i+2]);
                        break;
                    case 0xC8: // TIE
                        iprintf("C8               TIE: %.2X\n",message_data[i+2]);
                        break;
                    case 0xC9: // PORTAMENTO
                        iprintf("C9        PORTAMENTO: %.2X\n",message_data[i+2]);
                        break;
                    case 0xCA: // MODULATION DEPTH
                        iprintf("CA  MODULATION DEPTH: %.2X\n",message_data[i+2]);
                        break;
                    case 0xCB: // MODULATION SPEED
                        iprintf("CB  MODULATION SPEED: %.2X\n",message_data[i+2]);
                        break;
                    case 0xCC: // MODULATION TYPE
                        iprintf("CC   MODULATION TYPE: %.2X\n",message_data[i+2]);
                        break;
                    case 0xCD: // MODULATION RANGE
                        iprintf("CD  MODULATION RANGE: %.2X\n",message_data[i+2]);
                        break;
                    case 0xCE: // PORTAMENTO ON/OFF
                        iprintf("CE PORTAMENTO ON/OFF: %.2X\n",message_data[i+2]);
                        break;
                    case 0xCF: // PORTAMENTO TIME
                        iprintf("CF   PORTAMENTO TIME: %.2X\n",message_data[i+2]);
                        break;
                    case 0xD4: //LOOP START
                        iprintf("%X:",message_data[i+5]);
                        iprintf("D4        LOOP START: %d\n",message_data[i+2]);
                        break;
                    case 0xD6: // PRINT VAR
                        iprintf("D6         PRINT VAR: %.2X\n",message_data[i+2]);
                        break;

                    case 0xE0: // MODULATION DELAY
                        iprintf("E0  MODULATION DELAY: %.2X %.2X\n",message_data[i+2],message_data[i+3]);
                        break;
                    case 0xE3: // SWEEP PITCH
                        iprintf("E3       SWEEP PITCH: %.2X %.2X\n",message_data[i+2],message_data[i+3]);
                        break;
                    case 0xFC:
                        iprintf("%X:",message_data[i+5]);
                        iprintf("FC          LOOP END:\n");
                        break;
                    case 0xFF:
                        iprintf("%X:",message_data[i+5]);
                        iprintf("FF      END OF TRACK:\n");
                        break;
                    default:
                        iprintf("%.2X  Unrecognized cmd: %.2X %.2X %.2X",message_data[i+1],message_data[i+2],message_data[i+3],message_data[i+4]);
                        break;
#endif
                    }
                }
            }
            message_pointer -= j;
        }
        scanKeys();
        if (keysDown() & KEY_A)
        {
            if(PlayMode)
            {
                fifoSendDatamsg(FIFO_SNDSYS, sizeof(curr_seq), (u8*) &curr_seq);	//User may have stopped current sequence.
            }
            else
            {
                if(SSEQMode)
                {
                    ReadSSEQ();
                }
                else
                {
                    if (CurrentSPS != NULL)
                    {
                        free(CurrentSPS);
                    }

                    CurrentSPS = malloc(23 + strlen(DIRList[CurrentFile])+1);
                    strcpy(CurrentSPS, "/data/NDS Music Player/");
                    strcat(CurrentSPS, DIRList[CurrentFile]);
                    CurrentSPS[23 + strlen(DIRList[CurrentFile])]=0;

                    ReadSPS();
                }
            }
        }

        if (keysDown() & KEY_B)
        {
            if(PlayMode)
            {
                PlayMode = false;
                SSEQMode = true;
                ShowSSEQ();
            }
            else
            {
                if(SSEQMode)
                {
                    SSEQMode = false;
                    ShowDIR();
                }
                else
                {
                    ShowDIR();
                }
            }
        }

        if (keysDown() & KEY_X)
        {
            ManualStop = true;
            StopSeq();
        }
        if (keysDown() & KEY_Y)
        {
            ManualStop = true;
            FadeSeq();
        }

        if(keysDown() & KEY_SELECT)
        {
            AutoPlay = !AutoPlay;
            if(PlayMode)
            {
                if(AutoPlay)
                    iprintf("Auto Play enabled\n");
                else
                    iprintf("Auto Play disabled\n");
            }
        }

        if(keysDown() & KEY_START)
        {
            PauseSeq();
        }

        if (keysDown() & KEY_UP)
        {
            if(PlayMode)
            {
            }
            else
            {
                if(SSEQMode)
                {
                    if(CurrentSSEQ > 0)
                    {
                        CurrentSSEQ--;
                    }
                    else
                    {
                        CurrentSSEQ = SSEQCount - 1;
                    }
                    ShowSSEQ();
                }
                else
                {
                    if(CurrentFile > 0)
                    {
                        CurrentFile--;
                    }
                    else
                    {
                        CurrentFile = FileCount;
                    }
                    ShowDIR();
                }
            }
        }

        if (keysDown() & KEY_DOWN)
        {
            if(PlayMode)
            {
            }
            else
            {
                if(SSEQMode)
                {
                    if(CurrentSSEQ < SSEQCount - 1)
                    {
                        CurrentSSEQ++;
                    }
                    else
                    {
                        CurrentSSEQ = 0;
                    }
                    ShowSSEQ();
                }
                else
                {
                    if(CurrentFile < FileCount)
                    {
                        CurrentFile++;
                    }
                    else
                    {
                        CurrentFile = 0;
                    }
                    ShowDIR();
                }
            }
        }

        if (keysDown() & KEY_LEFT)
        {
            if(PlayMode)
            {
            }
            else
            {
                if(SSEQMode)
                {
                    if(CurrentSSEQ >= 23)
                    {
                        CurrentSSEQ -= 23;
                    }
                    else
                    {
                        CurrentSSEQ = 0;
                    }
                    ShowSSEQ();
                }
                else
                {
                    if(CurrentFile >= 23)
                    {
                        CurrentFile -= 23;
                    }
                    else
                    {
                        CurrentFile = 0;
                    }
                    ShowDIR();
                }
            }
        }

        if (keysDown() & KEY_RIGHT)
        {
            if(PlayMode)
            {
            }
            else
            {
                if(SSEQMode)
                {
                    if(CurrentSSEQ < (SSEQCount - 24))
                    {
                        CurrentSSEQ += 23;
                    }
                    else
                    {
                        CurrentSSEQ = SSEQCount - 1;
                    }
                    ShowSSEQ();
                }
                else
                {
                    if(CurrentFile < (FileCount - 24))
                    {
                        CurrentFile += 23;
                    }
                    else
                    {
                        CurrentFile = FileCount;
                    }
                    ShowDIR();
                }
            }
        }

        if (keysDown() & KEY_L)
        {
            if (PlayMode)
            {
                if(CurrentSSEQ > 0)
                {
                    CurrentSSEQ--;
                }
                else
                {
                    CurrentSSEQ = SSEQCount - 1;
                }
                ReadSSEQ();
            }
        }

        if (keysDown() & KEY_R)
        {
            if (PlayMode)
            {
                if(CurrentSSEQ < SSEQCount - 1)
                {
                    CurrentSSEQ++;
                }
                else
                {
                    CurrentSSEQ = 0;
                }
                ReadSSEQ();
            }
        }
    }
}