DOS下运行的软件具有编写简单,操作快捷,支持批操作等一系列优点,所以在Win和各种可视化操作系统极大盛行的今天,仍然能够在电脑中看到他的身影。这里提供一个我写的MTK铃声生成工具。把下面的C代码拷贝到VC里直接编译就可以了。把客户提供的铃声放到同一个文件夹里,把生成的.exe文件拷贝到该文件里后,双击就可以生成需要的C文件。这里主要使用了读写文件函数和查找文件函数,并提供了一个查找相关类型文件的算法,简单的对MAIN函数参数做了解析。该程序主要用于MTK平台开发,MTK平台使用的铃声与图片一般都是以数组方式存放,而手工使用UE把铃声或者图片打开,一个一个的存放到数组里显然是不现实的。写一个小程序实现该功能,有时有一件很有趣的事,既可以复习一下C语言知识,也可以学以致用。本程序是在匆匆之下写就,错误之处在所难免,欢迎指证。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
#define FORMAT_IMY (18) /* sync with med_main.h */
#define FORMAT_MID (17) /* sync with med_main.h */
#define FORMAT_WAV (13) /* sync with med_main.h */
#define FORMAT_MMF (20) /* sync with med_main.h */
#define FORMAT_MP3 (5) /* sync with med_main.h */
#define FORMAT_PCM (7) /* sync with med_main.h */
#define FORMAT_DVI (11) /* sync with med_main.h */
#define FORMAT_AMR (3) /* sync with med_main.h */
char * getfilename(char * filename)
{
char strResult[128]={0}; //保存结果
char *temp, *ret;
int i;
temp = filename;
int nStrLen = strlen(filename); //原始字符串长度
for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
{
if (filename[i] == '//') //如果当前字符是反斜杠
{
break;
}
}
if(i == 0)
{
ret = temp;
}
else
{
ret = (temp+i+1);
}
return (ret);
}
char * getfileextname(char * filename)
{
char strResult[128]={0}; //保存结果
char *temp, *ret;
int i;
temp = filename;
int nStrLen = strlen(filename); //原始字符串长度
for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
{
if (filename[i] == '.') //如果当前字符是反斜杠
{
ret = (temp+i+1);
break;
}
}
return (ret);
}
BOOL isMusicFile(char * filename)
{
if (memcmp(filename, "null", 4)==0)
{
return false;
}
if ((memcmp(getfileextname(filename), "mp3", 3) == 0) ||
(memcmp(getfileextname(filename), "mid", 3) == 0) ||
(memcmp(getfileextname(filename), "wav", 3) == 0)
)
{
return true;
}
else
{
return false;
}
}
int getfilevalue(char * extfilename)
{
if (memcmp(extfilename, "mp3", 3) == 0)
{
return (int)FORMAT_MP3;
}
else if (memcmp(extfilename, "mid", 3) == 0)
{
return (int)FORMAT_MID;
}
else if (memcmp(extfilename, "wav", 3) == 0)
{
return (int)FORMAT_WAV;
}
else
{
return 0;
}
}
char * modifystr(char * str)
{
char *tmp;
int i;
tmp = str;
for (i = 0; i < (int)strlen(str)-1; i++)
{
if ((str[i] == ' ') || (str[i] == '.'))
{
*(tmp+i) = '_';
}
}
return tmp;
}
int music2res(char * music, char * res)
{
long infileLen; //文件长度
int n=0,num=1; //n 字节计数器, NUM换行指示
unsigned char c, c_in; //C_in文件字节,C转化
FILE *fh_in;
FILE *fh_out;
char com[256]={0};
char filename[256]={0};
assert((music != NULL) && (res != NULL));
fh_in = fopen(music,"rb");
if (NULL==fh_in)
{
printf("open read file error!!");
return 1;
}
fseek(fh_in,0,SEEK_END);
infileLen=ftell(fh_in);
fseek(fh_in,0,SEEK_SET);
fh_out=fopen(res,"ab");
if (NULL==fh_out)
{
printf("open write file error!!");
return 1;
}
/*写入注释*/
memcpy(filename, getfilename(music), 256);
sprintf(com, "/*The alert is : %s, size is: %ld byte */", filename, infileLen);
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);
memset(com, 0x00, 128);
modifystr(filename);
sprintf(com, "__align(2) static const unsigned char %s[] = {", filename);
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);
/*写入数据*/
while (n<(infileLen))
{
putc('0',fh_out);
putc('x',fh_out);
c_in=getc(fh_in);
c=c_in;
c=(c>>4)&0x0f; //获取高四个BIT的内容
if (c<0x0a)
{
c+=0x30; //把符号转成数字
}
else
{
c+=0x37; //转成a到f
}
putc(c,fh_out);
c=c_in&0x0f; //获取低四个BIT内容
if (c<0x0a)
{
c+=0x30;
}
else
{
c+=0x37;
}
putc(c,fh_out);
putc(',',fh_out);
n++;
if (num++ % 16 ==0)
{
putc(0x0d,fh_out);
putc('/n',fh_out);
}
}
putc('}',fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);
memset(com, 0x00, 128);
sprintf(com, "{%s, sizeof(%s), %d}", filename, filename, getfilevalue(getfileextname(music)));
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);
fclose(fh_in);
fclose(fh_out);
return 0;
}
int main(int argc, char* argv[])
{
WIN32_FIND_DATA fd;
HANDLE hd=::FindFirstFile((LPCTSTR)"*.*",&fd); //开始查找
if(hd==INVALID_HANDLE_VALUE)
{
if (!isMusicFile(fd.cFileName))
printf("没有找到文件");
return 0;
}
if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
{
if (isMusicFile(fd.cFileName))
{
music2res(fd.cFileName, (char *)"resource_audio.c");
}
}
while(FindNextFile(hd,&fd)) //继续查找
{
if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
{
if (isMusicFile(fd.cFileName))
{
music2res(fd.cFileName, (char *)"resource_audio.c");
}
}
}
FindClose(hd);//关闭查找
return 0;
}
分享到:
相关推荐
- **功能**:FS_FindFirstN 用于查找目录下的第一个符合条件的文件,而 FS_FindNextN 则继续查找后续的文件。 - **应用场景**:遍历目录下的所有文件,进行批量处理。 ##### 7. FS_SetSeekHint:设置寻址提示 - **...
此函数适用于从文件中读取数据到内存中进行处理。 #### 四、`int FS_Write(FS_HANDLE FileHandle, void* DataPtr, UINT Length, UINT* Written)` `FS_Write`允许将内存中的数据写入文件。与`FS_Read`类似,它接收...
MTK(MediaTek)的MMI(Man Machine Interface)框架是一个高度模块化、易于扩展的体系结构,它由一系列精心设计的组件构成,旨在方便新应用程序的集成及第三方应用的接入。MMI框架的核心特性包括: - **模块化设计...
例如,SCAT文件(静态配置文件)中常出现的“overlay”关键字,便是指代内存复用的一种方式,通过允许不同程序在不同时刻共享同一块内存,有效缓解了RAM资源的压力。 当RAM资源接近耗尽时,开发者无需立即考虑增加...
本资源集中的“fs.rar_6253 mtk_MTK CODEBASE_MTK file system_fs mtk_mt6253”是专为研究MT6253芯片文件系统设计的压缩包,对于深入理解MT6253平台上的文件系统工作原理极具价值。 文件系统是操作系统的核心部分,...
由于IMX290和IMX291驱动相同,这意味着两者在硬件接口和功能上可能存在高度相似性,因此一个驱动可以同时支持这两种传感器。在实际应用中,可能会根据具体传感器的差异进行微调,例如增益设置、曝光时间、白平衡等...
在V0.2010.110版本中,我们可以推测这是2010年11月的一个早期版本,可能包含了基本的功能实现和初步的稳定性测试。 驱动开发的关键在于理解和适配硬件特性。对于SPI接口,开发者需要编写代码来设置时钟频率、极性、...
"LOCK.dat"可能是一个包含解锁数据或配置信息的文件,用于存储和读取与解锁过程相关的数据。"SkinH_EL.dll"、"rnr_20.dll"和"system.dll"是动态链接库文件,它们包含了程序运行所需的功能模块,如用户界面皮肤、运行...
设计的高性能GSM/GPRS基带处理器,它集成了多种先进的技术和特性,适用于移动通信设备如手机等。此处理器在设计上注重了低功耗与高性能之间的平衡,旨在为用户提供优质的通信体验。 - **平台特点**: - 高度集成:...
详细描述了MT6225如何管理和分配内存资源,以确保程序的高效运行。 ##### 3.3 总线系统 描述了内部总线结构及其工作原理,包括数据总线、地址总线等。 ##### 3.4 直接内存访问 直接内存访问(DMA)机制允许数据在...