/*********************************************************************** 函数功能:创建一个子空文件 操作内容: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);//需要扫描父目录的起始簇中空白可以写入子目录的项 }
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(); } } } }