历史上的今天
返回首页

历史上的今天

今天是:2024年11月14日(星期四)

正在发生

2019年11月14日 | 为madplay编写应用程序

2019-11-14 来源:51hei

这篇文章的app程序是参考国嵌的。

在编写app之前我们要编译好madplay


准备工作一:

编译madplay

首先解压三个压缩文件

[root@localhost ~]# cd /work/projects/sound/

[root@localhost sound]# ls

libid3tag-0.15.1b.tar.gz libmad-0.15.1b.tar.gz madplay-0.15.2b.tar.gz

[root@localhost sound]# tar xzf libid3tag-0.15.1b.tar.gz  //从名字上看是个库

[root@localhost sound]# tar xzf libmad-0.15.1b.tar.gz     //这个也是库

[root@localhost sound]# tar xzf madplay-0.15.2b.tar.gz  //这个是应用程序,它依赖这两个库

[root@localhost sound]#


[root@localhost sound]# cd libid3tag-0.15.1b

[root@localhost libid3tag-0.15.1b]# ./configure--host=arm-linux --prefix=/work/projects/sound/tmp

configure: WARNING: If you wanted to set the --build type, don't use--host.

    If a cross compiler isdetected then cross compile mode will be used.

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes


然后再

make

make install
再按照上面的方法进入libmad-0.15.1b文件夹编译

./configure --host=arm-linux --prefix=/work/projects/sound/tmpLDFLAGS="-L/work/projects/sound/tmp/lib" CFLAGS="-I/work/projects/sound/tmp/include"

注意: -L/work…..

这个-L与/之间没有空格.

然后再

make

make install

把tmp/bin/*  tmp/lib/*so* -d把库文件复制到开发板lib文件夹,bin文件复制到开发板的bin文件夹


# madplay --tty-control /mnt/mp3/beyond.mp3

MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 RobertLeslie et al.

s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66

         Artist: Beyond£¨»Æ¼ò¾Ô£©

          Album:òôàÖμîìÃMusicPalace

        Comment:http://music.zkinfo.ha.cn

s3c2410-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66


到这里时候测试下自己的开发板能否播放mp3音乐。

注意事项:确保自己的开发板已经有声卡了,想提高播放音乐的音量不能用madplay提供的方法(声音加大会破掉,而且音质会变得很差),如果你的开发板有QT界面直接调整音量滑块。


准备工作二:

编写开发板上的驱动程序。我的开发板是TQ2440。

key_drv_irq.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


static int major;

static struct class *key_class;

static struct class_device        *key_class_dev;


volatile unsigned long *gpfcon;

volatile unsigned long *gpfdat;


static DECLARE_WAIT_QUEUE_HEAD(button_waitq);


/* 中断事件标志, 中断服务程序将它置1,third_drv_read将它清0 */

static volatile int ev_press = 0;



struct pin_desc{

        unsigned int pin;

        unsigned int key_val;

};



/* 键值: 按下时, 0x01, 0x02, 0x03, 0x04 */

/* 键值: 松开时, 0x81, 0x82, 0x83, 0x84 */

static unsigned char key_val;


struct pin_desc pins_desc[4] = {

        {S3C2410_GPF1, 0x01},

        {S3C2410_GPF4, 0x02},

        {S3C2410_GPF2, 0x03},

        {S3C2410_GPF0, 0x04},

};


/*

  * 确定按键值

  */

static irqreturn_t buttons_irq(int irq, void *dev_id)

{

        struct pin_desc * pindesc = (struct pin_desc *)dev_id;

        unsigned int pinval;

        

        pinval = s3c2410_gpio_getpin(pindesc->pin);


        if (pinval)

        {

                /* 松开 */

                key_val = 0x80 | pindesc->key_val;

        }

        else

        {

                /* 按下 */

                key_val = pindesc->key_val;

        }


  ev_press = 1;                  /* 表示中断发生了 */

  wake_up_interruptible(&button_waitq);   /* 唤醒休眠的进程 */

        

        return IRQ_RETVAL(IRQ_HANDLED);

}


static int key_drv_open(struct inode *inode, struct file *file)

{

  /* 配置成输入模式 */

  request_irq(IRQ_EINT1, buttons_irq, IRQT_BOTHEDGE, "K1", &pins_desc[0]);

  request_irq(IRQ_EINT4, buttons_irq, IRQT_BOTHEDGE, "K2", &pins_desc[1]);  

  request_irq(IRQ_EINT2, buttons_irq, IRQT_BOTHEDGE, "K3", &pins_desc[2]);

  request_irq(IRQ_EINT0, buttons_irq, IRQT_BOTHEDGE, "K4", &pins_desc[3]);

    

  return 0;

}


static ssize_t key_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)

{

        if (size != 1)

                return -EINVAL;


        /* 如果没有按键动作, 休眠 */

        wait_event_interruptible(button_waitq, ev_press);


        /* 如果有按键动作, 返回键值 */

        copy_to_user(buf, &key_val, 1);

        ev_press = 0;

        

        return 1;

}


int key_dev_close(struct inode *inode, struct file *file)

{

        free_irq(IRQ_EINT1, &pins_desc[0]);

        free_irq(IRQ_EINT4, &pins_desc[1]);

        free_irq(IRQ_EINT2, &pins_desc[2]);

        free_irq(IRQ_EINT0, &pins_desc[3]);

  return 0;

}

            

static struct file_operations key_drv_fops={

  .owner=THIS_MODULE,

  .open=key_drv_open,

  .read=key_drv_read,

  .release=key_dev_close,

};


static int key_drv_init(void)

{

  major=register_chrdev(0, "key_drv", &key_drv_fops);

  key_class=class_create(THIS_MODULE, "keydrv");

  key_class_dev=class_device_create(key_class, NULL, MKDEV(major,0), NULL,"buttons"); /* dev/buttons */

  

  gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16); //0x56000010是的GPIOB的

        gpfdat = gpfcon + 1;

        

  return 0;

}


static void key_drv_exit(void)

{

  unregister_chrdev(major, "key_drv");

  class_device_unregister(key_class_dev);

  class_destroy(key_class);   //class_destory(key_class); 

  iounmap(gpfcon);

}


module_init(key_drv_init);

module_exit(key_drv_exit);


MODULE_LICENSE("GPL");


准备工作三:


app-mp3.c

/*

*     mp3播放器控制程序

*           功能:

                         k1:播放、暂停

                         k2:停止播放

                         k3:上一首

                         k4:下一首

*     附加:歌曲自动循环播放

*

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


/*共享内存申请标记*/

#define PERM S_IRUSR|S_IWUSR                                                                                                        


/*双向循环列表:存放歌曲名*/

struct song                                

{

        char songname[20];

        struct song *prev;

        struct song *next;

};


/*孙子进程id号*/

pid_t gradchild;


/*子进程id号*/

pid_t pid;


/*共享内存描述标记*/

int shmid;


char *p_addr;


/*播放标记*/

int first_key=1;

int play_flag=0;


/*************************************************

Function name: play

Parameter    : struct song *

Description         : 播放函数

Return                 : void

Argument     : void

Autor & date : ada 09,12,07

**************************************************/

void play(struct song *currentsong)

{

        pid_t fd;

        char *c_addr;

        char *p;

        int len;

        char my_song[30]="/mp3/";

        while(currentsong)

        {

                /*创建子进程,即孙子进程*/

                fd = fork();

                if(fd == -1)

                {        

                        perror("fork");

                        exit(1);

                }

                else if(fd == 0)

                {

                        /*把歌曲名加上根路径*/

                        strcat(my_song,currentsong->songname);

                        p = my_song;

                        len = strlen(p);


                        /*去掉文件名最后的'n'*/

                        my_song[len-1]='';

推荐阅读

史海拾趣

Datakey Electronics公司的发展小趣事

在环境问题日益严重的今天,绿色环保已经成为电子产品行业的重要发展趋势。Datakey Electronics积极响应国家号召,致力于绿色产品的研发和生产。公司投入巨资研发环保材料和生产工艺,成功推出了一系列符合环保标准的产品。这些产品不仅满足了客户的需求,还为公司赢得了良好的社会声誉。

Altonics公司的发展小趣事

在技术创新的基础上,Altonics公司积极拓展市场。公司不仅在国内建立了完善的销售网络,还积极开拓国际市场,产品远销海外。同时,公司注重品牌建设,通过提供优质的产品和服务,树立了良好的品牌形象。公司的广告宣传和展会参展活动也提升了品牌知名度,为公司的长远发展奠定了坚实的基础。

Elcoma公司的发展小趣事

面对日益变化的市场环境和客户需求,Elcoma公司始终保持创新的精神。他们不断投入研发资金,引进高端人才,加强技术创新和产品研发。同时,Elcoma还积极探索新的商业模式和市场机会,以适应市场变化并抓住发展机遇。这种创新驱动的发展策略使Elcoma在电子行业中保持领先地位,并为企业的未来发展奠定了坚实的基础。

EDAL公司的发展小趣事

EDAL公司始终秉持持续创新和客户至上的理念。公司不断投入研发资源,推出新的EDA产品和解决方案,满足客户的多样化需求。同时,EDAL公司还建立了完善的客户服务体系,为客户提供全方位的技术支持和解决方案。这些举措不仅增强了客户对EDAL公司的信任和忠诚度,还为公司的长期发展奠定了坚实的基础。

电连(ECT)公司的发展小趣事

随着汽车智能化的发展,ECT看到了车载连接器市场的巨大潜力。从2013年开始,公司开始布局车载连接器领域,并成功开发出多款适用于不同车型和场景的车载连接器产品。这一拓展不仅为ECT带来了新的增长点,也进一步巩固了公司在电子连接器行业的领先地位。

迈翔科技(COILMX)公司的发展小趣事

迈翔科技(COILMX)的创始人看到了电子行业,特别是电感器市场的巨大潜力。1996年,公司正式成立,初期主要专注于SMD电感的设计、制造和销售。公司从香港起步,逐步在深圳设立工厂,引进先进的生产设备和技术,为未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

三电平变频器原理

三电平变频器原理是啥?坛友中有开发三电平变频的吗?…

查看全部问答>

有谁知道怎么用protues里的示波器吗

有谁知道怎么用protues里的示波器吗…

查看全部问答>

sip

最近在研究关于SIP协议,希望大家指点!!…

查看全部问答>

关于Wince 远程调试

CE5.0自己定制的系统,将程序下载到板子上运行一切正常。 F5远程调试的时候报错:无法找到PBworkplace\\GLX701\\...\\commdlg.dll 可是我的PBworkplace下并没有GLX701这个文件夹。 程序是别人写的,我只是搬过来做些改动。 不知道是我定制系统 ...…

查看全部问答>

modbus协议实现问题

请问高手们,modbus协议实现的时候RTU格式下的起始位,也就是3.5个字符的时间停顿如何判断阿?高手有做过的指点一下。高分回送。 e-mail:dong1677@tom.com…

查看全部问答>

quartus的builder中有uart的ip核了,那还需要用vhdl编写uart硬件?

quartus的builder中有uart的ip核了,那还需要用vhdl编写uart硬件?是不是基本的ip核,builder中都有了?can通信口好象没有,那这个实验是不是要自己用vhdl写一个硬件,再仿真确保正确,然后生成用户制定IP,这样硬件就完成,在nios中编写想要实 ...…

查看全部问答>

求助文件系统移植到pic18f**20中遇到的问题

Error   [141] E:\\SD_example\\copy\\SD\\sd.c; 2.18 can\'t open include file \"pic18.h\": Too many open files     这个头文件我已经包含了,而且在其他模块编译中能够找到这个头文件,可到文件系统对SD卡操作这一块, ...…

查看全部问答>

酒精传感器的安装求大神帮助

本人大一学生,小白一个,想做一个酒精传感器,就跟警察手里拿的一样,不知道从何下手,希望能帮助,。我的扣扣是1106630774…

查看全部问答>

6618 不能配置DSP BIOS

各位大仙 我使用的是TCI6618,新建了一个工程,想配置它的DSP BIOS(.tcf文件),但是CCS5.2里面 file->new->DSP bios configuration file->... 找不到支持6618的platform,有哪位大仙知道怎么解决。 谢谢!…

查看全部问答>

e络盟日前宣布与 @德州仪器 (TI)携手推出HapTouchBoosterPack。

e络盟日前宣布与 @德州仪器 (TI)携手推出HapTouchBoosterPack。该扩展板将SP430TCH5E触觉MCU及TI DRV2603触觉驱动器整合到常见游戏控制器的外形中,可帮助开发人员快速将触觉技术集成到设计当中。详情点此链接:http://t.cn/8Fy5yzs …

查看全部问答>