summaryrefslogtreecommitdiff
path: root/xineplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'xineplayer.c')
-rw-r--r--xineplayer.c128
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;
+}
+