blob: af668ecd52ea7bc3c81d908322c8538b3b86a66a [file] [log] [blame]
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <log/log.h>
#include <unistd.h>
#include <pthread.h>
#include "lynq_rtp.h"
#include "liblog/lynq_deflog.h"
#define USER_LOG_TAG "LYNQ_RTP"
char server_cmd[MAX_CMD_SIZE];
char client_cmd[MAX_CMD_SIZE];
typedef struct
{
LYNQ_Rtp_Mode mode;
char ip[128];
int port;
int clockrate;
char address[128];
int latency;
int channels;
}lynq_rtp_info;
lynq_rtp_info lynq_rtp_client_info;
lynq_rtp_info lynq_rtp_server_info;
int g_lynq_rtp_mode;
int g_lynq_rtp_pid;
pthread_t lynq_rtp_server_pid = 0;
int get_pid(char *name)
{
char buf[256] = "";
char cmd[30] = "";
int pid = -1;
sprintf(cmd, "pidof %s", name);
FILE *pFd = popen(cmd, "r");
if (pFd != NULL)
{
while (fgets(buf, sizeof(buf), pFd))
{
pid = atoi(buf);
break;
}
pclose(pFd);
}
return pid;
}
int lynq_set_rtp_mode_media_play(const LYNQ_Rtp_Mode rtp_mode)
{
if (rtp_mode == 0)
{
lynq_rtp_client_info.mode = 0;
}
else if (rtp_mode == 1)
{
lynq_rtp_server_info.mode = 1;
}
g_lynq_rtp_mode = rtp_mode;
LYLOGSET(LOG_INFO);
LYLOGEINIT(USER_LOG_TAG);
return 0;
}
int lynq_set_rtp_ip_media_play(LYNQ_Rtp_Mode rtp_mode,const char* ip,const int ip_length)
{
if (NULL == ip)
{
LYERRLOG("ip is NULL!!!");
return -1;
}
if (ip_length != strlen(ip))
{
LYERRLOG("incoming ip length error");
return -1;
}
if (rtp_mode == 1)
{
bzero(lynq_rtp_server_info.ip,MAX_IP_LENGTH);
strcpy(lynq_rtp_server_info.ip,ip);
}
else if (rtp_mode == 0)
{
bzero(lynq_rtp_client_info.ip,MAX_IP_LENGTH);
strcpy(lynq_rtp_client_info.ip,ip);
}
return 0;
}
int lynq_set_rtp_port_media_play(LYNQ_Rtp_Mode rtp_mode,const int port)
{
if (port < 0)
{
LYERRLOG("invalid port number");
return -1;
}
if (rtp_mode == 0)
{
lynq_rtp_client_info.port = port;
}
else if (rtp_mode == 1)
{
lynq_rtp_server_info.port = port;
}
return 0;
}
int lynq_set_rtp_param_media_play(LYNQ_Rtp_Mode rtp_mode,char *file_address,const int clock_rate,const int channels,const int latency)
{
if (NULL == file_address)
{
LYERRLOG("file address is NULL");
return -1;
}
if (rtp_mode == 0)
{
lynq_rtp_client_info.clockrate = clock_rate;
lynq_rtp_client_info.channels = channels;
lynq_rtp_client_info.latency = latency;
}
if (rtp_mode == 1)
{
strcpy(lynq_rtp_server_info.address,file_address);
}
return 0;
}
#ifdef GSW_RTP_CFG
/*hqing add for Geely demand on 11/17/2022, after playing audio, codec should sleep*/
void set_codec(int open)
{
RLOGD("set_codec %d",open);
if(open==0)
{
system("echo out 201 0 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
system("echo out 181 0 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
}
else
{
system("echo out 181 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
usleep(10);//just open need usleep 10us
system("echo out 201 1 >/sys/devices/platform/10005000.pinctrl/mt_gpio");
system("echo 0x00 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x01 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x02 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x03 0x80 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x04 0x04 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x05 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x06 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x07 0xa0 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x08 0x20 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x09 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x0a 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x0b 0x32 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x0c 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x0d 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x0f 0x10 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x10 0x20 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x11 0xf8 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x12 0xff > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x13 0x04 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x14 0x78 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x15 0x78 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x16 0x04 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x17 0x78 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x18 0x78 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x19 0x80 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x1a 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x1b 0xfe > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x1c 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x1d 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x1e 0xfe > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x1f 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x20 0x18 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x21 0x18 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x22 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x23 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x24 0xc0 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x25 0xc0 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x26 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x27 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x28 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x29 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x2a 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x2b 0x02 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x2c 0x02 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x2d 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x2e 0x02 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x2f 0x85 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x30 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x31 0x80 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x32 0x85 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x33 0x9f > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x34 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x35 0x80 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x36 0x82 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x37 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x38 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x39 0x82 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x3a 0x9f > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x3b 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x3c 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x3d 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x3e 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x3f 0x80 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x40 0xaf > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x41 0x0d > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x42 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x43 0x80 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x44 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x45 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x46 0x02 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x47 0xaf > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x48 0x0d > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x49 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x4a 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x4b 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x4c 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x4d 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x4e 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x4f 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x50 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x51 0x02 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x52 0xbf > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x53 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x54 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x55 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x56 0x9b > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x57 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x58 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x59 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x5a 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x5b 0x02 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x5c 0xbf > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x5d 0x08 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x5e 0xde > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x5f 0x0c > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x60 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x61 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x62 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x63 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x64 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x65 0x01 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x66 0xa2 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x67 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x68 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x69 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x6a 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x6b 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x6c 0x40 > /sys/kernel/debug/regmap/0-0018/registers");
system("echo 0x6d 0x00 > /sys/kernel/debug/regmap/0-0018/registers");
}
}
#endif
void* lynq_pthread_rtp_system()
{
int ret = 0;
ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
if (g_lynq_rtp_mode == 0)
{
#ifdef GSW_RTP_CFG
set_codec(1);
#endif
bzero(client_cmd,MAX_CMD_SIZE);
sprintf(client_cmd,"gst-launch-1.0 udpsrc port=%d caps=\'application/x-rtp, media=(string)audio, clock-rate=(int)%d, channel=(int)%d\' ! rtpjitterbuffer latency=%d ! rtppcmadepay ! pulsesink", \
lynq_rtp_client_info.port,lynq_rtp_client_info.clockrate,lynq_rtp_client_info.channels,lynq_rtp_client_info.latency);
system(client_cmd);
}
else if (g_lynq_rtp_mode == 1)
{
bzero(server_cmd,MAX_CMD_SIZE);
sprintf(server_cmd,"gst-launch-1.0 -v filesrc location=\"%s\" ! decodebin ! audioconvert ! audioresample ! alawenc ! rtppcmapay ! udpsink host=%s auto-multicast=true port=%d", \
lynq_rtp_server_info.address, lynq_rtp_server_info.ip,lynq_rtp_server_info.port);
system(server_cmd);
}
}
int lynq_start_rtp_server_media_play()
{
int ret = 0;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&lynq_rtp_server_pid,&attr,lynq_pthread_rtp_system,0);
if(ret <0)
{
LYERRLOG("urc pthread create error");
return -1;
}
return ret;
}
int lynq_stop_rtp_server_media_play()
{
int ret = 0;
if(lynq_rtp_server_pid != 0)
{
ret = pthread_cancel(lynq_rtp_server_pid);
LYINFLOG("pthread cancel ret = %d",ret);
ret = pthread_join(lynq_rtp_server_pid,NULL);
LYINFLOG("pthread join ret = %d",ret);
}
else
{
LYERRLOG("rtp stop error");
return -1;
}
return 0;
}
/*query part*/
int lynq_get_rtp_ip_media_play(const LYNQ_Rtp_Mode rtp_mode, char* ip, const int ip_length)
{
if (NULL == ip)
{
LYERRLOG("incoming ip is NULL!!!");
return -1;
}
if (rtp_mode == 0)
{
bzero(ip,ip_length);
strcpy(ip,lynq_rtp_client_info.ip);
}
else if (rtp_mode == 1)
{
bzero(ip,ip_length);
strcpy(ip,lynq_rtp_server_info.ip);
}
return 0;
}
int lynq_get_rtp_port_media_play(LYNQ_Rtp_Mode rtp_mode,int* port)
{
if (rtp_mode == 0)
{
*port = lynq_rtp_client_info.port;
}
else if (rtp_mode == 1)
{
*port = lynq_rtp_server_info.port;
}
return 0;
}
int lynq_get_rtp_param_media_play(LYNQ_Rtp_Mode rtp_mode,char *file_address,int* clock_rate,int* channels,int* latency)
{
if (NULL == file_address)
{
LYERRLOG("file address is NULL");
return -1;
}
if (rtp_mode == 0)
{
*clock_rate = lynq_rtp_client_info.clockrate;
*channels = lynq_rtp_client_info.channels ;
*latency = lynq_rtp_client_info.latency;
}
if (rtp_mode == 1)
{
strcpy(file_address,lynq_rtp_server_info.address);
}
return 0;
}