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; }
int uhMpd(UrlHandlerParam* param) { char *action; char *pbuf = param->pucBuffer; int bufsize = param->iDataBytes; HTTP_XML_NODE node; mwParseQueryString(param); action = mwGetVarValue(param->pxVars, "action", 0); mwWriteXmlHeader(&pbuf, &bufsize, 10, "gb2312", mwGetVarValue(param->pxVars, "xsl", 0)); mwWriteXmlString(&pbuf, &bufsize, 0, "<response>"); node.indent = 1; node.name = "state"; node.fmt = "%s"; node.flags = 0; if (!strcmp(param->pucRequest + 1, "playlist")) { PL_ENTRY *ptr; int i; if (!action) { } else if (!strcmp(action, "add")) { char *filename = mwGetVarValue(param->pxVars, "stream", 0); char *title = mwGetVarValue(param->pxVars, "title", 0); if (!title) title = ""; if (!filename) { node.value = "error"; } else { int fnlen; int titlelen; char *entrydata; mwDecodeString(filename); fnlen = strlen(filename); titlelen = strlen(title); entrydata = (char*)malloc(fnlen + titlelen + 3); strcpy(entrydata, filename); strcpy(entrydata + fnlen + 1, title); node.value = plAddEntry(&playlist, entrydata, fnlen + titlelen + 2) ? "OK" : "error"; } mwWriteXmlLine(&pbuf, &bufsize, &node, 0); } else if (!strcmp(action, "pin")) { int index = mwGetVarValueInt(param->pxVars, "arg", 0); node.value = plPinEntryByIndex(&playlist, index) ? "OK" : "error"; mwWriteXmlLine(&pbuf, &bufsize, &node, 0); } else if (!strcmp(action, "del")) { int index = mwGetVarValueInt(param->pxVars, "arg", 0); node.value = plDelEntryByIndex(&playlist, index) ? "OK" : "error"; mwWriteXmlLine(&pbuf, &bufsize, &node, 0); } ptr = playlist; mwWriteXmlString(&pbuf, &bufsize, 1, "<playlist>"); for (i=0; ptr; ptr = ptr->next, i++) { char buf[32]; snprintf(buf, sizeof(buf), "<item index=\"%03d\">", i); mwWriteXmlString(&pbuf, &bufsize, 2, buf); node.indent = 3; node.name = "stream"; node.fmt = "%s"; node.value = ptr->data; mwWriteXmlLine(&pbuf, &bufsize, &node, 0); node.flags = XN_CDATA; node.name = "title"; node.value = (char*)ptr->data + strlen(ptr->data) + 1; mwWriteXmlLine(&pbuf, &bufsize, &node, 0); mwWriteXmlString(&pbuf, &bufsize, 2, "</item>"); } mwWriteXmlString(&pbuf, &bufsize, 1, "</playlist>"); } else if (!action) { } else if (!strcmp(action, "play")) { char *filename = mwGetVarValue(param->pxVars, "stream", 0); char *args = mwGetVarValue(param->pxVars, "arg", 0); if (filename && *filename) { mwDecodeString(filename); filename = strdup(filename); } if ((!filename || !*filename) || plAddEntry(&playlist, filename, strlen(filename) + 1)) { if (!mpThreadHandle) { if (args) mwDecodeString(args); ThreadCreate(&mpThreadHandle, mpThread, args); } else { mpClose(); } node.value = "OK"; } else { node.value = "error"; } mwWriteXmlLine(&pbuf, &bufsize, &node, 0); } else if (!strcmp(action, "query")) { int i; char* info; for (i = 0; info = mwGetVarValue(param->pxVars, "info", i); i++) { if (!strcmp(info, "pos")) { node.name = "pos"; node.fmt = "%d"; node.value = (void*)mpPos; mwWriteXmlLine(&pbuf, &bufsize, &node, 0); } else if (!strcmp(info, "state")) { node.name = "state"; node.fmt = "%s"; node.value = states[mpState]; mwWriteXmlLine(&pbuf, &bufsize, &node, 0); } } } else if (!strcmp(action, "pause")) { mpState = (mpState == MP_PLAYING ? MP_PAUSED : MP_PLAYING); mpCommand("pause"); } else if (!strcmp(action, "seek")) { char buf[32]; char *args = mwGetVarValue(param->pxVars, "arg", 0); if (args) { snprintf(buf, sizeof(buf), "seek %s", args); mpCommand(buf); } } else if (!strcmp(action, "command")) { char *cmd = mwGetVarValue(param->pxVars, "arg", 0); char *hasResult = mwGetVarValue(param->pxVars, "result", 0); if (cmd) { if (mpCommand(cmd) > 0) { node.value = "OK"; if (hasResult) { int bytes; MutexLock(&mpConsoleMutex); bytes = snprintf(pbuf, bufsize, " <result><![CDATA["); pbuf += bytes; bufsize -= bytes; bytes = mpRead(pbuf, bufsize); MutexUnlock(&mpConsoleMutex); if (bytes > 0) { pbuf += bytes; bufsize -= bytes; } bytes = snprintf(pbuf, bufsize, "]]></result>"); pbuf += bytes; bufsize -= bytes; } } else { node.value = "error"; } mwWriteXmlLine(&pbuf, &bufsize, &node, 0); } } else { return 0; } mwWriteXmlString(&pbuf, &bufsize, 0, "</response>"); param->iDataBytes=(int)(pbuf-param->pucBuffer); param->fileType=HTTPFILETYPE_XML; return FLAG_DATA_RAW; }