设为首页 加入收藏

TOP

用ARM实现音乐电子相册(二)
2017-10-11 15:05:01 】 浏览:6387
Tags:ARM 实现 音乐 电子相册
} fclose(img_fp); close(fp);
return 0; } static void PutPixel(unsigned int x,unsigned int y,unsigned short rgb565) { if ((x <= XSIZE) && (y <= YSIZE)){ *(fb_mem_kernel+(y-1)*XSIZE+(x-1))=rgb565; } }

 

 

2、音乐驱动程序Audio_player.c

#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>

#include <sys/types.h>
#include <linux/soundcard.h>

//下面的三个参数是跟具体文件相关的,文件什么样,就设置成什么样 

#define SAMPLE_RATE 22050       //采样率:22050(22 56 00 00)
#define BIT_SIZE 16         //量化位数
#define CHANNELS 2          //通道数:1表示单声道,2为立体声

int main(int argc, char *argv[])
{
    FILE     *wav_fd;
    int     fd, *buf; 
    int     wav_length, arg, status;
    unsigned char *wav_buf;

    if(argc<2){                    //如果argc的值是1,说明程序名后面没有命令行参数
        printf("Usage:%s xxx.wav !\n",argv[0]);   //argv[0]的值是启动该程序的程序名 
            exit(1);
    }

    wav_fd = fopen(argv[1], "r");

    if (wav_fd == NULL) {
        printf("Open wav_file %s error !\n",argv[1]); 
        exit(1);
    }
    printf("Test iis+UDA1341 OSS interface to play %s file.\n",argv[1]); 

    fseek(wav_fd, 0x28L, SEEK_SET);     //文件大小
    buf = (int*) malloc(sizeof(int));
    fread(buf,sizeof(int),1,wav_fd);
    wav_length = *buf;
    free(buf);
    printf("wav_file length is: %xH.\n",wav_length);
    printf("Play......\n");
            
        fd = open("/dev/dsp", O_WRONLY);       //arm中一般不可使用O_RDWR

        if (fd < 0) {
            printf("Open of /dev/dsp failed");
            exit(1);
        }

        arg = CHANNELS;        //设置通道数
        status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
        if (status == -1)
            perror("SOUND_PCM_WRITE_CHANNELS ioctl failed.");
        
    arg = BIT_SIZE;        //设置量化位数
        status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
        if (status == -1)
             perror("SOUND_PCM_WRITE_BITS ioctl failed.");

         arg = SAMPLE_RATE;    //设置采样率
        status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
         if (status == -1)
            perror("SOUND_PCM_WRIT_RATE ioctl failed.");

    //从wav文件中读wav_length大小的内容,然后写入/dev/dsp中

    fseek(wav_fd, 0x2cL, SEEK_SET);     
    
    wav_buf =(unsigned char*) malloc(wav_length);

    fread(wav_buf, wav_length, 1, wav_fd);    //读文件数据
    write(fd, wav_buf, wav_length);

    free(wav_buf);
    fclose(wav_fd);
    close(fd);
    return 0;
}

 

 

3、电子相册的驱动程序E_Album.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#include <unistd.h>
static void sig_usr(int signo);      
static void sig_alarm(int signo);
int i=1;
pid_t child_pid;
                                                                        
int main()
{
    pid_t pid;

        if (signal(SIGALRM, sig_alarm) < 0) perror("signal SIGALRM error:");
        if (signal(SIGUSR2, sig_usr) < 0) perror("signal SIGUSR2 error:");
    pid=fork();                                                                                
        if ( pid == 0 ){    /* 子进程 */
        printf("child_pid= %d\n",getpid());
        for(;;){
            system("./Audio_player RedStream.wav");
            pause();
        }
        exit(0);
    }
    else{            /* 父进程 */
        child_pid=pid;
        for(;;){
            alarm(3);
            pause();
        }
    }
        return 0;
}
static void sig_usr(int signo){    int ret;
        printf("SIGUSR2 comming..... \n");
        if((ret=kill(child_pid,SIGCONT))<0)    perror("kill error:");}
static void sig_alarm(int signo)
{
    char    *str0,*str1,Display_img[50];

    str0 ="./LCD_img b_fly"
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇uboot引导linux内核过程详解【转】 下一篇FPGA基础知识(二)FPGA芯片结构

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目