作者:yaoyinghua2012 | 来源:互联网 | 2023-09-07 15:10
在应用程序开发过程中,有些时候我们需要自己编写demo去测试封装好的底层接口,如果对界面编程有不太熟悉,这时候可以怎么做呢?这里以测试播放器相关的接口为例,编写一个轮询stdin的
在应用程序开发过程中,有些时候我们需要自己编写demo去测试封装好的底层接口,如果对界面编程有不太熟悉,这时候可以怎么做呢?
这里以测试播放器相关的接口为例,编写一个轮询stdin的小demo,用于测试播放器的play、pause、stop、快进快退等接口功能。
int main(int argc, char *argv[])
{
if (argc == 1) {
printf("=============== How to Use %s ====================\n",argv[0]);
printf("%s URL mediatype (1: video 2:image 3:music)\n",argv[0]);
printf("exp:%s /usb/sda/1.avi 1 \n",argv[0]);
printf("exp:%s /usb/sda/1.jpg 2 \n",argv[0]);
printf("exp:%s /usb/sda/1.mp3 3 \n",argv[0]);
return 1;
}
signal(SIGINT, signalHandler); //这里注册一个Ctrl+c 退出的信号处理函数
printf("\n");
printf("\n");
printf("Set Input source to MM\n");
// AppIpcApi_SetInputSource(E_APPIPC_INPUT_SOURCE_STORAGE,false);
printf("/////////////////////////////////////////////////////////////////////\n");
printf("Start MM Test Code.\n");
printf("/////////////////////////////////////////////////////////////////////\n");
printf("argc=%d\n",argc);
if(argc >= 3) {
switch(atoi(argv[2]))
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
g_mediatype = atoi(argv[2]);
break;
default:
printf("argv[2]=%s\n",argv[2]);
break;
}
}
if (argc >= 2 ){
printf("argv[1]=%s\n",argv[1]);
g_url = argv[1];
MM_test(argv[1]);
} else {
printf("Argument Error Play Default Video\n");
g_mediatype = 1;
MM_test(VideoFile);
}
printf("/////////////////////////////////////////////////////////////////////\n");
printf("End MM Test Code.\n");
printf("/////////////////////////////////////////////////////////////////////\n");
printf("\n");
printf("\n");
return 0;
}
static void signalHandler( int signum )
{
cout <<"Interrupt signal (" < // cleanup and close up stuff here
// terminate program
MM_ReleaseResource();
exit(signum);
}
static BOOL MM_Callback(void* arg1, void* arg2, void* arg3)
{
。。。。
case E_EVENT_INIT_OK:
MSG_INFO("Get E_EVENT_INIT_OK event.\n");
g_bInitDOne= TRUE;
g_bInitResult = TRUE;
pthread_cond_signal(&condNotify);
break;
}
static void parsecmd(char cmd[][256], char * ch)
{
int i, j, k;
int len = strlen(ch);
k = 0;
for (i = 0, j = 0; ((i {
if ((ch[i] != ' ') && (ch[i] != '\n'))
{
cmd[j][k++] = ch[i];
}
else
{
k = 0;
j++;
}
}
}
static void MM_test(const char* url)
{
pthread_mutex_init(&Mutex, NULL);
pthread_cond_init(&condNotify, NULL);
//这里一般会注册一些callback 到底层,用于接收底层返回的init等等的一些状态信息,在callback里面会发
pthread_cond_wait(&condNotify, &Mutex);
//前面做好一系列的初始化工作,下面起一个while循环一直去轮询console的stdin,如果有fd有异动,则先把stdin读出来,然后进行parse,再根据自定义的规则进行匹配,然后调用对应的接口进行测试
while (((g_bDecodeDOne== FALSE) && (g_bDecodeError == FALSE))||stMedia.eMediaType == E_PLAYER_MEDIA_TYPE_PHOTO){
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
fd_set fs;
FD_ZERO(&fs);
FD_SET(STDIN_FILENO, &fs);
signed int ret = select(STDIN_FILENO+1, &fs, NULL, NULL, &tv);
if (ret > 0 && FD_ISSET(STDIN_FILENO, &fs))
{
//printf("Command: %s\n",cmd[0]);
memset(ch, 0x00, 256);
read(STDIN_FILENO, ch, 255);
memset(cmd[0], 0x00, 256);
memset(cmd[1], 0x00, 256);
memset(cmd[2], 0x00, 256);
memset(cmd[3], 0x00, 256);
parsecmd(cmd, ch);
printf("<%s>", cmd[0]);
printf("<%s>", cmd[1]);
printf("<%s>", cmd[2]);
printf("<%s>", cmd[3]);
if(0 == strcmp(cmd[0], "setscolor"))
{
if (strlen(cmd[1]) > 0 && strlen(cmd[2]) > 0&& strlen(cmd[3]) > 0)
{
int r = atoi(cmd[1]);
int g = atoi(cmd[2]);
int b = atoi(cmd[3]);
U32 u32Color = (U32)(b<<24) + (U32)(g<<16) + (U32)(r<<8) + (U32)255;
pMMInterface->MM_SetSubtitleTextColor(g_u32Item, u32Color);
}
}
if(0 == strcmp(cmd[0], "setstrack"))
{
if (strlen(cmd[1]) > 0)
{
int trackID = atoi(cmd[1]);
printf("set subtitle track = %d",trackID);
pMMInterface->MM_SetSubtitleTrackID(g_u32Item,trackID);
}
}
if(0 == strcmp(cmd[0], "voldown"))
{
pMMInterface->MM_AudioVolumeDown();
}
。。。。
}