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; }
void mpClose() { mpPos = -1; if (mpState != MP_IDLE) { if (mpCommand("quit") > 0) ShellWait(&mpx,1000); ShellTerminate(&mpx); ShellClean(&mpx); } }