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