五、mini2440按键,从设备文件读取按键数据

select.c

else if (FD_ISSET(g_buttonfd, &tmpfd))    //按键有数据可读
        {
            int id = get_key_id();
            switch (id)
            {
                case 1:
                    start_play();
                    break;
                case 2:
                    stop_play();
                    break;
                case 3:
                    suspend_play();
                    break;
                case 4:
                    continue_play();
                    break;
                case 5:
                    prior_play();
                    break;
                case 6:
                    next_play();
                    break;
            }
        }

因为学习记录的所以不全,全部代码如下,如有需要可以自取:

一、device.c

//用于操作硬件设备

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "main.h"
#include <sys/ioctl.h>

extern int g_buttonfd;
extern int g_ledfd;
extern int g_mixerfd;
extern int g_maxfd;

int InitDriver()
{
    //打开按键设备文件
    g_buttonfd = open("/dev/buttons", O_RDONLY);
    if (-1 == g_buttonfd)
    {
        return FAILURE;
    }

    //打开led设备文件
    g_ledfd = open("/dev/leds", O_WRONLY);
    if (-1 == g_ledfd)
    {
        return FAILURE;
    }

    //所有LED灭
    int i;
    for (i = 0; i < 4; i++)
    {
        ioctl(g_ledfd, 0, i);
    }

    //打开minxer设备文件
    g_mixerfd = open("/dev/mixer", O_WRONLY);
    if (-1 == g_mixerfd)
    {
        return FAILURE;
    }

    if (g_mixerfd > g_maxfd)
    {
        g_maxfd = g_mixerfd;
    }

    return SUCCESS;
}

void led_on(int which)
{
    ioctl(g_ledfd, 1, which);    
}

void led_off(int which)
{
    ioctl(g_ledfd, 0, which);
}

int get_key_id()
{
    char buttons[6] = {'0', '0', '0', '0', '0', '0'};
    char cur_buttons[6] = {0};

    int ret = read(g_buttonfd, cur_buttons, sizeof(cur_buttons));
    if (-1 == ret)
    {
        perror("read");
    }

    int i;
    for (i = 0; i < 6; i++)
    {
        if (buttons[i] != cur_buttons[i])
        {
            return i + 1;
        }
    }
    return 0;
}

二、device.h

#ifndef DEVICE_H
#define DEVICE_H

int InitDriver();
int led_on(int which);
int led_off(int which);

#endif

三、link.c

#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#include <string.h>
#include "link.h"
#include "player.h"
#include <time.h>

extern struct Node *head;

//初始化双向循环链表
int InitLink()
{
    head = (Node *)malloc(sizeof(Node) * 1);
    if (NULL == head)
    {
        return FAILURE;
    }

    head->next = head;
    head->prior = head;

    return SUCCESS;
}

int InsertLink(Node *h, const char *name)
{
    if (NULL == h || NULL == name)
    {
        return FAILURE;
    }

    Node *end = h->prior;


    Node *n = (Node *)malloc(sizeof(Node) * 1);
    if (NULL == n)
    {
        return FAILURE;
    }

    n->next = h;
    strcpy(n->music_name, name);
    end->next = n;
    n->prior = end;
    h->prior = n;

    return SUCCESS;
}

/*
函数描述:根据当前歌曲和播放模式,找到下一首歌
函数参数:cur:当前歌曲
          mode:播放模式
          next:存放下一首歌名
返回值:无
*/
void FindNextMusic(const char *cur, int mode, char *next)
{
    if (mode == CIRCLE)     //单曲循环
    {
        strcpy(next, cur);
        return;
    }
    else if (mode == SEQUENCEMODE)
    {
        Node *p = head->next;
        while (strcmp(p->music_name, cur) != 0)
        {
            p = p->next;
        }
            
        if (p->next == head)          //忽略头结点
        {
            strcpy(next, head->next->music_name);
        }
        else
        {
            strcpy(next, p->next->music_name);
        }
        return;
    }
    else 
    {
        Node *p = head->next;
        srand(time(NULL));
        int num = rand() % 100;

        int i;
        for (i = 0; i < num; i++)
        {
            p = p->next;
        }

        if (p == head)
        {
            strcpy(next, head->next->music_name);
        }
        else
        {
            strcpy(next, p->music_name);
        }

        return;
    }
}

void PriorMusic(const char *cur, int mode, char *prior)
{
    if (mode == SEQUENCEMODE || mode == CIRCLE)
    {
        Node *p = head->next;
        while (strcmp(p->music_name, cur) != 0)
        {
            p = p->next;
        }

        if (p == head->next)
        {
            printf("%s\n", head->prior->music_name);
            strcpy(prior, head->prior->music_name);
        }
        else
        {
            strcpy(prior, p->prior->music_name);
        }
        return;
    }
    else 
    {
        Node *p = head->next;
        srand(time(NULL));
        int num = rand() % 100;

        int i;
        for (i = 0; i < num; i++)
        {
            p = p->next;
        }

        if (p == head)
        {
            strcpy(prior, p->next->music_name);
        }
        else
        {
            strcpy(prior, p->music_name);
        }

        return;
    }
}

void NextMusic(const char *cur, int mode, char *next)
{
    if (mode == SEQUENCEMODE || mode == CIRCLE)
    {
        Node *p = head->next;
        while (strcmp(p->music_name, cur) != 0)
        {
            p = p->next;
        }

        if (p->next == head)
        {
            strcpy(next, head->next->music_name);
        }
        else
        {
            strcpy(next, p->next->music_name);
        }
        return;
    }
    else 
    {
        Node *p = head->next;
        srand(time(NULL));
        int num = rand() % 100;

        int i;
        for (i = 0; i < num; i++)
        {
            p = p->next;
        }

        if (p == head)
        {
            strcpy(next, p->next->music_name);
        }
        else
        {
            strcpy(next, p->music_name);
        }

        return;
    }
}

四、link.h

#ifndef LINK_H
#define LINK_H

struct Node
{
    char music_name[64];
    struct Node *next;
    struct Node *prior;
};
typedef struct Node Node;

int InitLink();
void FindNextMusic(const char *cur, int mode, char *next);
int InsertLink(Node *h, const char *name);
void PriorMusic(const char *cur, int mode, char *prior);
void NextMusic(const char *cur, int mode, char *next);

#endif

五、main.c

#include <stdio.h>
#include "main.h"
#include "device.h"
#include <stdlib.h>
#include "socket.h"
#include "link.h"
#include "player.h"
#include <signal.h>
#include <sys/ipc.h> 
#include <sys/shm.h>
#include <string.h>
#include <sys/select.h>

int g_buttonfd = 3;
int g_ledfd;
int g_mixerfd;
int g_sockfd = 3;
struct Node *head;
extern int shmid;
extern void *g_addr;
fd_set readfd, tmpfd;
int g_maxfd;


void m_select();

void handler(int sig)
{
    shm s;
    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));
    kill(s.child_pid, SIGKILL);
    kill(s.grand_pid, SIGKILL);

    shmdt(g_addr);
    shmctl(shmid, IPC_RMID, NULL);

    close(g_sockfd);

    exit(0);
}

int main()
{
    int ret;
    ret = InitDriver();     //打开设备文件
    if (FAILURE == ret)
    {
        printf("初始化设备文件失败\n");
        exit(1);
    }
    
    InitSelect();

    ret = InitSocket();      //初始化网络
    if (FAILURE == ret)
    {
        printf("初始化网络失败\n");
        //初始化失败,点亮 2 个LED灯
        led_on(0);
        led_on(1);
    }

    //初始化链表
    ret = InitLink();
    if (FAILURE == ret)
    {
        printf("链表初始化失败\n");
        exit(1);
    }

    //初始化共享内存
    ret = InitShm();
    if (FAILURE == ret)
    {
        printf("共享内存初始化失败\n");
        exit(1);
    }

    //读取音乐
    GetMusic();

    //捕获ctrl c信号
    signal(SIGINT, handler);

    m_select();

    return 0;
}

六、main.h

#ifndef MAIN_H
#define MAIN_H

#define SUCCESS     10000
#define FAILURE     10001

#endif

七、player.c

#include <stdio.h>
#include "link.h"
#include "main.h"
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include "player.h"
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>

extern int g_mixerfd;
extern Node *head;
void *g_addr = NULL;      //共享内存映射地址
int shmid;

int g_start_flag = 0;     //表示没有开始播放音乐
int g_suspend_flag = 0;   //表示没有暂停

int iLeft = 20;
int iRight = 60;

int InitShm()
{
    //创建共享内存
    shmid = shmget(SHMKEY, SHMSIZE, IPC_CREAT | IPC_EXCL);
    if (-1 == shmid)
    {
        return FAILURE;
    }

    //映射
    g_addr = shmat(shmid, NULL, 0);
    if (NULL == g_addr)
    {
        return FAILURE;
    }

    //初始化共享内存数据
    shm s;
    s.play_mode = SEQUENCEMODE;
    s.ppid = getpid();
    memcpy(g_addr, &s, sizeof(s));

    return SUCCESS;
}

//判断是不是.mp3结尾
int m_mp3_end(const char *name)
{
    const char *ptr = name;

    while (*ptr != '\0')
    {
        ptr++;
    }
    int i;
    for (i = 0; i < 4; i++)
    {
        ptr--;
    }
    
    if (ptr < name)
        return 0;
    
    return (strcmp(ptr, ".mp3") == 0) ? 1 : 0;
}

void GetMusic()
{
    //打开目录
    DIR *dir = opendir(MUSICPATH);
    if (NULL == dir)
    {
        perror("opendir");
        exit(1);
    }

    struct dirent *file = NULL;

    //读取目录
    while ((file = readdir(dir)) != NULL)
    {
        if (file->d_type != 8)      //不是普通文件
        {
            continue;
        }

        if (!m_mp3_end(file->d_name))   //不是mp3文件
        {
            continue;
        }

        printf("%s\n", file->d_name);

        int ret = InsertLink(head, file->d_name);
        if (FAILURE == ret)
        {
            printf("歌曲插入失败\n");
            exit(1);
        }
    }
}

void play_music(const char *name)
{
    pid_t child_pid = fork();
    if (-1 == child_pid)
    {
        perror("fork");
        exit(1);
    }
    else if (0 == child_pid)         //子进程
    {
        while (1)
        {
            pid_t grand_pid = vfork();
            if (-1 == grand_pid)
            {
                perror("fork");
                exit(1);
            }
            else if (0 == grand_pid)    //孙进程
            {
                char cur_name[64] = {0};
                shm s;

                //获取共享内存
                int shmid = shmget(SHMKEY, SHMSIZE, 0);
                if (-1 == shmid)
                {
                    perror("shmget");
                    exit(1);
                }

                //映射
                void *addr = shmat(shmid, NULL, 0);
                if (NULL == addr)
                {
                    perror("shmat");
                    exit(1);
                }

                if (strlen(name) != 0)      //直接开始播放
                {
                    strcpy(cur_name, name);    
                }
                else                        //遍历链表,找到一首歌播放
                {
                    //判断播放模式,找到一首歌曲
                    memcpy(&s, addr, sizeof(s));
                    FindNextMusic(s.cur_name, s.play_mode, cur_name);
                }

                //把信息写入共享内存(父子孙进程号、当前歌曲名)
                memcpy(&s, addr, sizeof(s));
                strcpy(s.cur_name, name);
                s.child_pid = getppid();
                s.grand_pid = getpid();
                memcpy(addr, &s, sizeof(s));
                shmdt(addr);           //解除映射

                char music_path[128] = {0};     //包含路径的歌曲名称
                strcpy(music_path, MUSICPATH);
                strcat(music_path, cur_name);
                printf("歌曲名字 %s\n", music_path);
                //execl("/usr/local/bin/madplay", "madplay", music_path, NULL);
                execl("/bin/madplay", "madplay", music_path, NULL);
            }
            else                        //子进程
            {
                memset((void *)name, 0, strlen(name));         //歌曲名长度变为0,方便下一次操作

                int status;
                waitpid(grand_pid, &status, 0);        //回收孙进程
            }
        }
    }
    else
    {
        return;
    }
}

void start_play()
{
    if (g_start_flag == 1)     //已经开始播放
    {
        return;
    }

    //获取歌曲名称
    if (head->next == NULL)    //空链表
    {
        return;
    }

    //设置音量
    int iLevel;
    iLeft = 80;
    iLevel = (iRight << 8) + iLeft;
    ioctl(g_mixerfd, MIXER_WRITE(SOUND_MIXER_VOLUME), &iLevel);

    //开始播放音乐
    //play_music(head->next->music_name);
    //play_music函数中会把head->next->music_name字符串清空修改成
    char name[128] = {0};
    strcpy(name, head->next->music_name);
    play_music(name);
    
    g_start_flag = 1;
}

void stop_play()
{
    if (g_start_flag == 0)
    {
        return;
    }

    //读取共享内存,获取pid
    shm s;
    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));

    //kill(s.grand_pid, SIGKILL);    //结束子进程
    //kill(s.child_pid, SIGKILL);    //结束孙进程
    
    kill(s.child_pid, SIGKILL);      //结束子进程
    kill(s.grand_pid, SIGKILL);      //结束孙进程
    
    g_start_flag = 0;
}

void suspend_play()
{
    if (g_start_flag == 0 || g_suspend_flag == 1)
    {
        return;
    }

    //读取共享内存,获取pid
    shm s;
    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));

    kill(s.grand_pid, SIGSTOP);     //暂停孙进程
    kill(s.child_pid, SIGSTOP);     //暂停子进程

    g_suspend_flag = 1;
}

void continue_play()
{
    if (g_start_flag == 0 || g_suspend_flag == 0)
    {
        return;
    }

    //读取共享内存,获取pid
    shm s;
    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));

    kill(s.grand_pid, SIGCONT);     //暂停孙进程
    kill(s.child_pid, SIGCONT);     //暂停子进程

    g_suspend_flag = 0;
}

void prior_play()
{
    if (g_start_flag == 0 || g_suspend_flag == 1)
    {
        return;
    }

    //读取共享内存,获取pid
    shm s;
    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));

    //kill(s.grand_pid, SIGKILL);    //结束子进程
    //kill(s.child_pid, SIGKILL);    //结束孙进程
    
    kill(s.child_pid, SIGKILL);      //结束子进程
    kill(s.grand_pid, SIGKILL);      //结束孙进程

    g_start_flag = 0;

    char name[64] = {0};
    PriorMusic(s.cur_name, s.play_mode, name);
    play_music(name);    
    g_start_flag = 1;
}

void next_play()
{
    if (g_start_flag == 0 || g_suspend_flag == 1)
    {
        return;
    }

    //读取共享内存,获取pid
    shm s;
    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));

    //kill(s.grand_pid, SIGKILL);    //结束子进程
    //kill(s.child_pid, SIGKILL);    //结束孙进程
    
    kill(s.child_pid, SIGKILL);      //结束子进程
    kill(s.grand_pid, SIGKILL);      //结束孙进程

    g_start_flag = 0;

    char name[64] = {0};
    NextMusic(s.cur_name, s.play_mode, name);
    play_music(name);    
    g_start_flag = 1;
}


void voice_up()
{
    int iLevel;

    if (iLeft < 100)
    {
        iLeft += 5;
    }

    iLevel = (iRight << 8) + iLeft;
    ioctl(g_mixerfd, MIXER_WRITE(SOUND_MIXER_VOLUME), &iLevel);
}

void voice_down()
{
    int iLevel;

    if (iLeft > 5)
    {
        iLeft -= 5;
    }

    iLevel = (iRight << 8) + iLeft;
    ioctl(g_mixerfd, MIXER_WRITE(SOUND_MIXER_VOLUME), &iLevel);
}

void set_mode(int mode)
{
    shm s;

    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));

    s.play_mode = mode;

    memcpy(g_addr, &s, sizeof(s));
    printf("模式修改成功!\n");
}

八、player.h

#ifndef PLAYER_H
#define PLAYER_H

#include <unistd.h>

//#define MUSICPATH   "/root/music_list/"
#define MUSICPATH   "/mount/usb/"
#define SHMKEY     1234
#define SHMSIZE    4096

#define SEQUENCEMODE    1
#define RANDOM          2
#define CIRCLE          3

//共享内存数据
struct shm
{
    int play_mode;
    char cur_name[64];
    pid_t ppid;
    pid_t child_pid;
    pid_t grand_pid;
};
typedef struct shm shm;

int InitShm();
void GetMusic();
void start_play();
void stop_play();
void suspend_play();
void continue_play();
void prior_play();
void next_play();
void voice_up();
void voice_down();
void set_mode(int mode);


#endif

九、select.c

#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include "player.h"
//#include <json-c/json.h>
#include <json/json.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "socket.h"
#include <errno.h>

extern int g_buttonfd;
extern int g_sockfd;
extern fd_set readfd;
extern fd_set tmpfd;
extern int g_maxfd;

void show()
{
    printf("1、开始播放\n");
    printf("2、结束播放\n");
    printf("3、暂停播放\n");
    printf("4、继续播放\n");
    printf("5、上一首\n");
    printf("6、下一首\n");
    printf("7、增加音量\n");
    printf("8、减小音量\n");
    printf("9、顺序播放\n");
    printf("a、随即播放\n");
    printf("b、单曲循环\n");
}

void parse_message(const char *m, char *c)
{
    struct json_object *obj = json_tokener_parse(m);

    struct json_object *json;
    //json_object_object_get_ex(obj, "cmd", &json);
    json = json_object_object_get(obj, "cmd");
    strcpy(c, json_object_get_string(json));
}

void InitSelect()
{
    FD_ZERO(&readfd);
    FD_ZERO(&tmpfd);
    FD_SET(g_buttonfd, &readfd);
}

void m_select()
{
    show();

    fd_set tmpfd;
    int ret;
    char message[1024] = {0};

    while (1)
    {
        tmpfd = readfd;
        ret = select(g_maxfd + 1, &tmpfd, NULL, NULL, NULL);
        if (-1 == ret && errno != EINTR)
        {
            perror("select");
        }
        else if (-1 == ret && errno == EINTR)
        {
            continue;
        }

        if (FD_ISSET(g_sockfd, &tmpfd))           //TCP有数据可读
        {
            memset(message, 0, sizeof(message));
            ret = recv(g_sockfd, message, sizeof(message), 0);
            if (-1 == ret)
            {
                perror("recv");
            }

            char cmd[64] = {0};
            parse_message(message, cmd);

            if (!strcmp(cmd, "start"))
            {
                socket_start_play();            
            }
            else if (!strcmp(cmd, "stop"))
            {
                socket_stop_play();
            }
            else if (!strcmp(cmd, "suspend"))
            {
                socket_suspend_play();
            }
            else if (!strcmp(cmd, "continue"))
            {
                socket_continue_play();
            }
            else if (!strcmp(cmd, "prior"))
            {
                socket_prior_play();
            }
            else if (!strcmp(cmd, "next"))
            {
                socket_next_play();
            }
            else if (!strcmp(cmd, "voice_up"))
            {
                socket_voice_up_play();
            }
            else if (!strcmp(cmd, "voice_down"))
            {
                socket_voice_down_play();
            }
            else if (!strcmp(cmd, "sequence"))
            {
                socket_mode_play(SEQUENCEMODE);
            }
            else if (!strcmp(cmd, "random"))
            {
                socket_mode_play(RANDOM);
            }
            else if (!strcmp(cmd, "circle"))
            {
                socket_mode_play(CIRCLE);
            }
            else if (!strcmp(cmd, "get"))     //获取状态
            {    
                socket_get_status();
            }
            else if (!strcmp(cmd, "music"))   //获取所有音乐
            {
                socket_get_music();                                
            }
        }
        else if (FD_ISSET(g_buttonfd, &tmpfd))    //按键有数据可读
        {
            int id = get_key_id();
            switch (id)
            {
                case 1:
                    start_play();
                    break;
                case 2:
                    stop_play();
                    break;
                case 3:
                    suspend_play();
                    break;
                case 4:
                    continue_play();
                    break;
                case 5:
                    prior_play();
                    break;
                case 6:
                    next_play();
                    break;
            }
        }
    }
}

十、socket.c

//跟网络相关的代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "main.h"
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include "device.h"
#include "socket.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
//#include <json-c/json.h>
#include <json/json.h>
#include "player.h"
#include <sys/select.h>
#include "link.h"

extern Node *head;
extern int g_sockfd;
extern int iLeft;
extern int g_start_flag;
extern int g_suspend_flag;
extern fd_set readfd;
extern int g_maxfd;
extern void *g_addr;

//5秒执行一次,向服务器发送 alive 字符串
void send_server(int sig)
{
    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("info"));
    json_object_object_add(json, "status", json_object_new_string("alive"));
    json_object_object_add(json, "deviceid", json_object_new_string("001"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }

    alarm(TIMEOUT);
}

void *connect_cb(void *arg)
{
    int count = 5, ret;
    struct sockaddr_in server_addr;

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = PF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);

    while (count--)
    {
        ret = connect(g_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
        if (ret == -1)
        {
            sleep(5);
            continue;
        }
        
        //连接成功,点亮 4 个LED灯
        led_on(0);
        led_on(1);
        led_on(2);
        led_on(3);

        alarm(TIMEOUT);
        signal(SIGALRM, send_server);

        //连接服务器成功,fd添加到集合
        FD_SET(g_sockfd, &readfd);
        if (g_maxfd < g_sockfd)
        {
            g_maxfd = g_sockfd;
        }

        break;
    }

    return NULL;
}

int InitSocket()
{
    g_sockfd = socket(PF_INET, SOCK_STREAM, 0);
    if (-1 == g_sockfd)
    {
        return FAILURE;
    }

    //启动线程向服务器发起连接
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, connect_cb, NULL);
    if (ret != 0)
    {
        return FAILURE;
    }

    return SUCCESS;
}

void socket_start_play()
{
    start_play();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("start_success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_stop_play()
{
    stop_play();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("stop_success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_suspend_play()
{
    suspend_play();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("suspend_success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_continue_play()
{
    continue_play();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("continue_success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_prior_play()
{
    prior_play();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_next_play()
{
    next_play();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_voice_up_play()
{
    voice_up();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_voice_down_play()
{
    voice_down();

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_mode_play(int mode)
{
    set_mode(mode);

    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply"));
    json_object_object_add(json, "result", json_object_new_string("success"));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_get_status()
{
    //播放状态  当前歌曲名  音量
    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply_status"));
    if (g_start_flag == 1 && g_suspend_flag == 0)
    {
        json_object_object_add(json, "status", json_object_new_string("start"));
    }
    else if (g_start_flag == 1 && g_suspend_flag == 1)
    {
        json_object_object_add(json, "status", json_object_new_string("suspend"));
    }
    else if (g_start_flag == 0)
    {
        json_object_object_add(json, "status", json_object_new_string("stop"));
    }
    json_object_object_add(json, "voice", json_object_new_int(iLeft));

    shm s;
    memset(&s, 0, sizeof(s));
    memcpy(&s, g_addr, sizeof(s));
    json_object_object_add(json, "music", json_object_new_string(s.cur_name));

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

void socket_get_music()
{
    struct json_object *json = json_object_new_object();
    json_object_object_add(json, "cmd", json_object_new_string("reply_music"));

    struct json_object *array = json_object_new_array();
    Node *p = head->next;
    while (p != head)
    {
        json_object_array_add(array, json_object_new_string(p->music_name));
        p = p->next;
    }

    json_object_object_add(json, "music", array);

    const char *buf = json_object_to_json_string(json);
    int ret = send(g_sockfd, buf, strlen(buf), 0);
    if (-1 == ret)
    {
        perror("send");
    }
}

十一、socket.h

#ifndef SOCKET_H
#define SOCKET_H

#define SERVER_PORT   8000
#define SERVER_IP     "47.101.128.140"
//#define SERVER_IP    "127.0.0.1"
#define TIMEOUT       1

int InitSocket();
void socket_start_play();
void socket_stop_play();
void socket_suspend_play();
void socket_continue_play();
void socket_prior_play();
void socket_next_play();
void socket_voice_up_play();
void socket_voice_down_play();
void socket_mode_play(int);
void socket_get_status();
void socket_get_music();

#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值