diff options
Diffstat (limited to 'xineplayer.c')
-rw-r--r-- | xineplayer.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/xineplayer.c b/xineplayer.c new file mode 100644 index 0000000..b3b07cb --- /dev/null +++ b/xineplayer.c @@ -0,0 +1,128 @@ + +#include "xineCommon.h" + +#include "xineExternal.h" + +static int fdControl = -1; +static int fdResult = -1; + +bool writeString(const char *s) +{ + int l = ::strlen(s); + + while (l) + { + int r = ::write(fdControl, s, l); + if (r < 0) + { + ::perror("xineplayer: writeString() failed"); + return false; + } + + l -= r; + s += r; + } + + return true; +} + +bool cmdPlay(char *const mrl) +{ + if (!::writeString("play ")) + return false; + + if (!::writeString(mrl)) + return false; + + if (!::writeString("\n")) + return false; + + return true; +} + +bool waitResult() +{ + char s; + + int r = ::read(fdResult, &s, 1); + if (r < 0) + { + ::perror("xineplayer: waitResult() failed"); + return false; + } + + return (1 == r); +} + +bool communicate(char *const mrl) +{ + if (!::cmdPlay(mrl)) + return false; + + if (!::waitResult()) + return false; + + return true; +} + +#define ARG_VDR_XINE_INSTANCE "--vdr-xine-instance=" + +int main(int argc, char *argv[]) +{ + if (argc < 2) + { + usage: + ::fprintf(stderr, "usage: xineplayer [ " ARG_VDR_XINE_INSTANCE "N ] [ options ] mrl\n"); + return 1; + } + + int instanceNo = -1; + + if (0 == ::strncmp(argv[ 1 ], ARG_VDR_XINE_INSTANCE, ::strlen(ARG_VDR_XINE_INSTANCE))) + { + instanceNo = ::atoi(argv[ 1 ] + ::strlen(ARG_VDR_XINE_INSTANCE)); + + if (instanceNo < 0) + goto usage; + + if (argc < 3) + goto usage; + } + + string fifoDir = FIFO_DIR; + + if (instanceNo >= 0) + { + char s[ 20 ]; + ::sprintf(s, "%d", instanceNo); + + fifoDir += s; + } + + string fifoNameExtControl = fifoDir + FIFO_NAME_EXT_CONTROL; + string fifoNameExtResult = fifoDir + FIFO_NAME_EXT_RESULT; + + fdResult = ::open(fifoNameExtResult.c_str(), O_RDONLY); + if (-1 == fdResult) + { + ::perror(("xineplayer: opening '" + fifoNameExtResult + "' failed").c_str()); + + ::close(fdControl); + return 1; + } + + fdControl = ::open(fifoNameExtControl.c_str(), O_WRONLY); + if (-1 == fdControl) + { + ::perror(("xineplayer: opening '" + fifoNameExtControl + "' failed").c_str()); + return 1; + } + + bool result = ::communicate(argv[ argc - 1 ]); + + ::close(fdControl); + ::close(fdResult); + + return !result; +} + |