微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 摄像头捕获源代码

摄像头捕获源代码

时间:10-02 整理:3721RD 点击:
嵌入式arm培训班资料

顶顶顶顶顶顶顶顶顶顶

我擦,不是说好的源代码吗

我擦,不是说好的源代码吗

我擦,不是说好的源代码吗

只见标题,不见内容

这是标题party?坑人啊···

ssssssssssssssssssssssss

先回复一个,看看内容

擦,不是说好的源代码吗

源代码呢?。

我知道了,这个是骗回复的吧。

啊啊,代码在哪里?

源码呢………………别骗我…………

标题party吗,代码在哪里?

我擦,不是说好的源代码吗

谢谢分享,分享万岁

标题party吗,代码在哪里?

在哪?、?

/*
*     mp3播放器控制程序
*           功能:
*                 k1:播放、暂停
*                 k2:停止播放
*                 k3:上一首
*                 k4:下一首
*     附加:歌曲自动循环播放
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
/*共享内存申请标记*/
#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/song/";   //存放歌曲的路径
        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]='\0';
                        printf("THIS SONG IS %s\n",my_song);
                        execl("/usr/bin/madplay","madplay",my_song,NULL);  //孙子进程调用execl函数,执行madplay程序
                        printf("\n\n\n");
                }
                else
                {
                        /*内存映射*/
                        c_addr = shmat(shmid,0,0);
                        /*把孙子进程的id和当前播放歌曲的节点指针传入共享内存*/
                        memcpy(c_addr,&fd,sizeof(pid_t));
                        memcpy(c_addr + sizeof(pid_t)+1,¤tsong,4);
                        /*使用wait阻塞孙子进程,直到孙子进程播放完才能被唤醒;
                          当被唤醒时,表示播放MP3期间没有按键按下,则继续顺序播放下一首MP3*/
                        if(fd == wait(NULL))  //等待进程结束
                        {
                                currentsong = currentsong->next;  //歌曲链表移向下一首歌
                                printf("THE NEXT SONG IS %s\n",currentsong->songname);
                        }
                }
        }
}
/*************************************************
Function name: creat_song_list
Parameter    : void
Description         : 创建歌曲名的双向循环链表
Return                 : struct song *
Argument     : void
Autor & date : ada 09.12.07
**************************************************/
struct song *creat_song_list(void)
{        
        FILE *fd;
        size_t size;
        size_t len=0;
        char *line = NULL;
        struct song *head;
        struct song *p1;
        struct song *p2;
        system("ls /mp3/song >song_list");   //重定向生成song_list文件
        fd = fopen("song_list","r");  //打开 song_list文件
        p1 = (struct song *)malloc(sizeof(struct song));
        printf("==================================song list=====================================\n");
        system("ls /mp3/song");        //打印所有歌曲名
        printf("\n");
        printf("================================================================================\n");
        size = getline(&line,&len,fd);//读取一首歌曲名,返回size为歌名字符串的长度 ,size大小由系统malloc
        strncpy(p1->songname,line,strlen(line));//将第一首歌名存入第一个节点
        head = p1;
        while((size = getline(&line,&len,fd)) != -1)//继续看是否有其他歌曲
        {        
                p2 = p1;   
                p1 = (struct song *)malloc(sizeof(struct song));  //创建节点空间
                strncpy(p1->songname,line,strlen(line));  //读取歌曲名
               
                p2->next = p1;  //前一个节点的next指向下一节点
                p1->prev = p2;        //后一个节点的prev指向上一个节点
        }
        
        p1->next = head; //尾节点的next指向头节点
        head->prev = p1;  //头节点的prev指向尾节点
        
        //链表创建完成,让p1,p2为空指针
        p1 = NULL;
        p2 = NULL;
        
        system("rm -rf song_list");//把之前重定向生成的文件删除
        
        return head;//返回双向循环链表的头节点的指针
}
/*************************************************
Function name: startplay
Parameter    : pid_t *,struct song *
Description         : 开始播放函数
Return                 : void
Argument     : void
Autor & date : ada 09.12.07
**************************************************/
void startplay(pid_t *childpid,struct song *my_song)
{
        pid_t pid;
        int ret;
        /*创建子进程*/
        pid = fork();
        if(pid > 0)
        {
                *childpid = pid;
                play_flag = 1;
                sleep(1);  //等待一秒,让孙子进程创建和保存
                /*把孙子进程的pid传给父进程*/
                memcpy(&gradchild,p_addr,sizeof(pid_t));  //因为使用共享内存,p_addr就是play(my_song)函数中的c_addr
        }
        else if(0 == pid)
        {        
                /*子进程播放MP3函数*/
                play(my_song);
        }
}
/*************************************************
Function name: my_pause
Parameter    : pid_t
Description         : 暂停函数
Return                 : void
Argument     : void
Autor & date : ada 09,12,07
**************************************************/
void my_pause(pid_t pid)
{
        printf("=======================PAUSE!PRESS K1 TO CONTINUE===================\n");
        kill(pid,SIGSTOP); //对孙子进程发送SKGSTOP信号
        play_flag = 0;
}
/*************************************************
Function name: my_pause
Parameter    : pid_t
Description         : 停止播放函数
Return                 : void
Argument     : void
Autor & date : ada 09,12,07
**************************************************/
void my_stop(pid_t g_pid)
{
        printf("=======================STOP!PRESS K1 TO START PLAY===================\n");
        kill(g_pid,SIGKILL); //对孙子进程发送SKGKILL信号
        kill(pid,SIGKILL);   //对子进程发送SKGKILL信号
        first_key=1;
}
/*************************************************
Function name: conti_play
Parameter    : pid_t
Description         : 继续函数
Return                 : void
Argument     : void
Autor & date : ada 09,12,07
**************************************************/
void conti_play(pid_t pid)
{
        printf("===============================CONTINUE=============================\n");
        kill(pid,SIGCONT); //对孙子进程发送SIGCONT信号
        play_flag=1;
}
/*************************************************
Function name: next
Parameter    : pid_t
Description         : 下一首函数
Return                 : void
Argument     : void
Autor & date : ada 09.12.07
**************************************************/
void next(pid_t next_pid)
{
        struct song *nextsong;
        printf("===============================NEXT MP3=============================\n");
        /*从共享内存获得孙子进程播放歌曲的节点指针*/
        memcpy(&nextsong,p_addr + sizeof(pid_t)+1,4);
        /*指向下首歌曲的节点*/
        nextsong = nextsong->next;
        /*杀死当前歌曲播放的子进程,孙子进程*/
        kill(pid,SIGKILL);
        kill(next_pid,SIGKILL);
        wait(NULL);
        startplay(&pid,nextsong);
}
/*************************************************
Function name: prev
Parameter    : pid_t
Description         : 上一首函数
Return                 : void
Argument     : void
Autor & date : yuanhui 09.12.08
**************************************************/
void prev(pid_t prev_pid)
{
        struct song *prevsong;
        /*从共享内存获得孙子进程播放歌曲的节点指针*/
        printf("===============================PRIOR MP3=============================\n");
        memcpy(&prevsong,p_addr + sizeof(pid_t)+1,4);
        /*指向上首歌曲的节点*/
        prevsong = prevsong->prev;
        /*杀死当前歌曲播放的子进程,孙子进程*/
        kill(pid,SIGKILL);
        kill(prev_pid,SIGKILL);
        wait(NULL);
        startplay(&pid,prevsong);
}
/*************************************************
Function name: main
Parameter    : void
Description         : 主函数
Return                 : int
Argument     : void
Autor & date : ada 09.12.07
**************************************************/
int main(void)
{
        
     int buttons_fd;//按键设备的文件标识符
     
        char buttons[6] = {'0', '0', '0', '0', '0', '0'};  //初始化六个按键,未按下为'0'
        
   /*打开设备文件*/
        buttons_fd = open("/dev/buttons", 0);  
        if (buttons_fd < 0) {   //判断打开按键设备是否成功
                perror("open device buttons");
                exit(1);
        }
        struct song *head;  //定义歌曲链表头节点
  /*创建播放列表*/
        head = creat_song_list();
        printf("===================================OPTION=======================================\n\n\n\n");
        printf("        K1:START/PAUSE     K2:STOP   K3:NEXT      K4:PRIOR\n\n\n\n");
        printf("================================================================================\n");

  /*共享内存:用于存放子进程ID,播放列表位置*/
        if((shmid = shmget(IPC_PRIVATE,5,PERM))== -1)//从内存中获取大小5个字节的共享内存,并判断获取是否成功
                exit(1);
        p_addr = shmat(shmid,0,0);//映射共享内存的地址到p_addr
        memset(p_addr,'\0',1024);  //把该内存的值全部初始化为'\0'
   for (;;) {
                char current_buttons[6];  //定义当前按键的值
                int keys_id;
                if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) {
                        perror("read buttons:");
                        exit(1);
                }
                for (keys_id = 0; keys_id < sizeof buttons / sizeof buttons[0]; keys_id++) {
                        if (buttons[keys_id] != current_buttons[keys_id])  //表示有按键按下
                                 {
                                
                                /*首次播放,必须是按键1*/
                                if(first_key){
                                        switch(keys_id)
                                        {        
                                        case 0:
                                                startplay(&pid,head);  //开始播放音乐
                                                first_key=0;   //按键1已经按下了
                                                break;
                                        case 1:
                                        case 2:
                                        case 3:
                                                printf("=======================PRESS K1 TO START PLAY===================\n");
                                                break;
                                    default:
                                                printf("=======================PRESS K1 TO START PLAY===================\n");
                                                break;
                                        }
                                }
                                /*若不是首次播放,则根据不同键值处理*/
                                else if(!first_key){
                                    switch(keys_id)
                                        {
                                        case 0:      //按键1还可以控制歌曲暂停和播放
                                                if(play_flag)
                                                        my_pause(gradchild);  //暂停
                                                else
                                                        conti_play(gradchild);//继续播放
                                                break;
                                        case 1:
                                                my_stop(gradchild);  //关闭当前播放的歌曲
                                                break;
                                        case 2:
                                                next(gradchild);  //播放下一首
                                                break;
                                        case 3:
                                                prev(gradchild);  //播放上一首
                                                break;
                                        }
                         }
                                
                        }
                }
        
               
               
        }
        close(buttons_fd);  //关闭按键设备文件
        return 0;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top