为madplay编写应用程序

发布者:石头12345最新更新时间:2019-11-14 来源: 51hei关键字:madplay  编写  应用程序 手机看文章 扫描二维码
随时随地手机看文章

这篇文章的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]='';

[1] [2] [3]
关键字:madplay  编写  应用程序 引用地址:为madplay编写应用程序

上一篇:TQ2440开发板 Linux第一个驱动--点灯
下一篇:关于ARM的22个概念

推荐阅读最新更新时间:2024-11-06 12:06

一个简单的makefile文件的编写
1.makefile文件的主要结构简介: makefile文件里面主要有三种内容: 1.变量声明: 变量声明就是一种基本的严格字符替换的操作。 比如在前面声明了:objects=program.o foo.o utils.o 那么在后面出现的所有$(objects)或者${objects}都会被自动替换成上面的那个字符序列,而且是严格替换,即不带空格的。 2.映射法则 3.命令: 映射法则和命令通常都是联合起来组成这样的结构形式: target... : prerequisites.. command 可以简单地理解为通过prere
[单片机]
一个简单的makefile文件的<font color='red'>编写</font>
STM32入门开发: 编写DS18B20温度传感器驱动(读取环境温度、支持级联)
一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103C8T6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) 温度传感器: DS1820 DS18B20是一个数字温度传感器,采用的是单总线时序与主机通信,只需要一根线就可以完成温度数据读取; DS18B20内置了64位产品序列号,方便识别身份,在一根线上可以挂接多个DS18B20传感器,通过64位身份验证,可以分别读取来至不同传感器采集的温度信息。 二、DS18B20介绍 2.1 DS18B20 的主要特征 1. 全数字温度转换及输出。 2. 先进的单总线数据通信。 3. 最高 12 位
[单片机]
STM32入门开发: <font color='red'>编写</font>DS18B20温度传感器驱动(读取环境温度、支持级联)
用单片机编写几种跑马灯程序
任务: 1、在电路板上实现跑马灯,一次1匹 2、在电路板上实现跑马灯,一次2匹 3、在电路板上实现4个二极管的同时闪烁 源程序1: /***********************************信息**************************************** **描叙:用电路板实现跑马灯。 *******************************************************************************/ /**********************************头文件***************************************
[单片机]
Ubuntu 8.10 下移植 madplay 到 mini2440
在 Ubuntu 8.10 下移植 madplay 到 mini2440过程中同样参考了网上的一篇帖子,由于当时未想到要把过程放到这就没有记录那篇帖子的网址,在此表示感谢! madplay移植记录: 一、PC版的madplay PC版的编译基本同mini2440手册上的一致。 二、ARM版的madplay 1、编译zlib-1.2.3 解压zlib-1.2.3.tar.gz到/opt/FriendlyARM/mini2440/madplay/src-arm/zlib-1.2.3 进入zlib-1.2.3目录 配置configure: sudo gedit configure a、把AR=${AR- ar rc }改为: AR=${
[单片机]
Keil C51编写的192*64液晶片驱动程序
/*--------------------------------------------------------------------------------------------------- Keil C51编写的192*64液晶片驱动程序,感谢很多网友提供了参考源程序, 本程序是在网友们提供的程序基础上改写而成,有很多地方得到高手们的耐 心指导,在此深表谢意。这是一个完整的C51源程序,我觉得对一位初学C51 的人来说,提供一个完整的简单程序比较容易上手。 ---------------------------------------------------------------------------------
[单片机]
Sdcc编译环境下中断函数的编写
1. Sdcc的中断 定义中断服务程序(ISR)时,中断函数的格式 void interrupt_identifier(void) __interrupt interrupt_number using bank_number { } 其中interrupt_identifier可以是任意有效的函数名,interrupt_number代表中断在中断向量表中的位置。bank_number用于指示SDCC采用哪个寄存器区存储ISR中断局部变量 __interrupt 前面为两个下划线 2. 注意事项 定义了的中断处理函数要和普通函数一样,在main函数前进行声明,声明格式: void interrupt_identifier(vo
[单片机]
耐克最新APP将使用增强现实技术远程帮助用户发现最合适的鞋码
每个人都能准确知道自己的鞋码吗?你可能认为你是清楚的,但很有可能 在 不同做工的品牌之下,你用着固定不变的标准去挑选鞋子后买到的鞋子并不十分合脚。 耐克(Nike)认为,它可以通过在其智能手机应用程序上增加一款新功能来改变这一状况。这款应用利用增强现实(augmented reality)的强大功能,可以对你的脚进行超精确扫描,根据你想买的鞋的类型,将你的脚与理想尺寸匹配起来。 在一篇新的博客文章中,耐克称目前的鞋码系统是“过时的”,称它就像是“一个复杂问题的粗略简化”。这就是耐克Fit的新尺寸测量功能存在的意义。 耐克将Nike Fit描述为“一种新的扫描解决方案,它使用了计算机视觉、数据科学、机器学习、人工智能和推荐算法的
[家用电子]
耐克最新APP将使用增强现实技术远程帮助用户发现最合适的鞋码
C语言编写的 24C02程序
#define uchar unsigned char #define uint unsigned int #include reg52.h #include stdio.h #include absacc.h sbit scl=P3^5; //24c02 SCL sbit sda=P3^4; //24c02 SDA sbit DOG=P1^7; //看门狗 uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据 void x24c02_write(uchar address,uchar info); //向24c02的address地址中写入一字节数据info v
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved