void* mpThread(void* _args) { char *p = NULL; char buf[1024]; char* args = _args ? strdup(_args) : 0; int n; int offset; void* data; for (;;) { if (data = plGetEntry(&playlist)) { n = mpOpen(data, args); } else { if (!loopclip) break; n = mpOpen(loopclip, 0); } free(data); if (n) break; mpState = MP_PLAYING; MutexLock(&mpConsoleMutex); while (mpCommand("get_time_pos") <= 0) msleep(500); do { offset = 0; while (offset < sizeof(buf) - 1) { n = mpRead(buf + offset, sizeof(buf) - 1 - offset); if (n <= 0) break; offset += n; buf[offset] = 0; if (p = strstr(buf, "ANS_TIME_POSITION=")) { mpPos = atoi(p + 18); break; } } // stop here when paused MutexUnlock(&mpConsoleMutex); do { msleep(500); } while (mpState == MP_PAUSED); MutexLock(&mpConsoleMutex); } while (mpCommand("get_time_pos") > 0); MutexUnlock(&mpConsoleMutex); ShellTerminate(&mpx); ShellClean(&mpx); } free(args); mpState = MP_IDLE; mpThreadHandle = 0; return 0; }
int uhMpd(UrlHandlerParam* param) { char *cmd=param->pucRequest; if (!strncmp(cmd,"open=",5)) { if (mpOpen(cmd+5) || !(mpRead(param->pucBuffer,param->iDataBytes))) { strcpy(param->pucBuffer,"Failed to launch MPlayer"); } } else if (!strncmp(cmd,"command=",8)) { strcpy(param->pucBuffer,(mpCommand(cmd+8)>0)?"OK":"Error"); } else { return 0; } param->iDataBytes=strlen(param->pucBuffer); param->fileType=HTTPFILETYPE_TEXT; return FLAG_DATA_RAW; }
int handleFileFunctionRequest(int acceptHandle, char *inBuffer, char *outBuffer, int type, int msgSize) { int32_t ret = -1; int32_t index = -1; int32_t mode = -1; int32_t flags = -1; int32_t fd = -1; int32_t maxBytes = -1; int sendRet = 0; int namelen = 0; short extensionId = -1; switch (type) { case FILE_CTRL_OPEN: flags = getInt32(inBuffer, 12); mode = getInt32(inBuffer, 16); ret = mpOpen(inBuffer + 20, flags, mode); setInt32(outBuffer, 0, 4); setInt32(outBuffer, 4, ret); sendRet = sendN(acceptHandle, outBuffer, 8, 0); if (sendRet != 8) { fprintf(stderr, "tcpSvr: sendRet = %d != 8\n", sendRet); return -1; } break; case FILE_CTRL_CREATE: flags = getInt32(inBuffer, 12); ret = mpCreate(inBuffer + 16, flags); setInt32(outBuffer, 0, 4); setInt32(outBuffer, 4, ret); sendRet = sendN(acceptHandle, outBuffer, 8, 0); if (sendRet != 8) { fprintf(stderr, "tcpSvr: sendRet = %d != 8\n", sendRet); return -1; } break; case FILE_CTRL_CLOSE: if (msgSize != 12) { fprintf(stderr, "tcpSvr: invalid msgSize for mpClose = %d != 12\n", msgSize); return -1; } fd = getInt32(inBuffer, 12); if (fd < 1) { fprintf(stderr, "tcpSvr: invalid fd for mpRead = %d\n", fd); return -1; } ret = mpClose(fd); setInt32(outBuffer, 0, 4); setInt32(outBuffer, 4, ret); sendRet = sendN(acceptHandle, outBuffer, 8, 0); if (sendRet != 8) { fprintf(stderr, "tcpSvr: sendRet = %d != 8\n", sendRet); return -1; } break; case FILE_CTRL_READ: fd = getInt32(inBuffer, 12); if (fd < 1) { fprintf(stderr, "tcpSvr: invalid fd for mpRead = %d\n", fd); return -1; } maxBytes = getInt32(inBuffer, 16); if (maxBytes < 1 || maxBytes >= (BUFF_MAX - 8)) { fprintf(stderr, "tcpSvr: invalid maxBytes for mpRead = %d max = %d\n", maxBytes,(BUFF_MAX-8)); return -1; } ret = mpRead(fd, outBuffer + 8, maxBytes); setInt32(outBuffer, 0, 4 + (ret > 0 ? ret : 0)); setInt32(outBuffer, 4, ret); sendRet = sendN(acceptHandle, outBuffer, 8 + (ret > 0 ? ret : 0), 0); if (sendRet != 8 + (ret > 0 ? ret : 0)) { fprintf(stderr, "tcpSvr: sendRet = %d != 8 + (ret > 0?ret:0)\n", sendRet); return -1; } break; case FILE_CTRL_WRITE: fd = getInt32(inBuffer, 12); if (fd < 1) { fprintf(stderr, "tcpSvr: invalid fd for mpRead = %d\n", fd); return -1; } maxBytes = getInt32(inBuffer, 16); if (maxBytes < 1 || maxBytes >= (BUFF_MAX - 8)) { fprintf(stderr, "tcpSvr: invalid maxBytes for mpRead = %d max = %d\n", maxBytes,(BUFF_MAX-8)); return -1; } ret = mpWrite(fd, inBuffer+20, maxBytes); setInt32(outBuffer, 0, 4 + (ret > 0 ? ret : 0)); setInt32(outBuffer, 4, ret); sendRet = sendN(acceptHandle, outBuffer, 8 + (ret > 0 ? ret : 0), 0); if (sendRet != 8 + (ret > 0 ? ret : 0)) { fprintf(stderr, "tcpSvr: sendRet = %d != 8 + (ret > 0?ret:0)\n", sendRet); return -1; } break; default: fprintf(stderr, "tcpSvr: invalid file function type = %d\n", type); return -1; } return 0; }