summaryrefslogtreecommitdiffstats
path: root/mpeglib_artsplug/mpeglibartsplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mpeglib_artsplug/mpeglibartsplay.cpp')
-rw-r--r--mpeglib_artsplug/mpeglibartsplay.cpp276
1 files changed, 276 insertions, 0 deletions
diff --git a/mpeglib_artsplug/mpeglibartsplay.cpp b/mpeglib_artsplug/mpeglibartsplay.cpp
new file mode 100644
index 00000000..66b69150
--- /dev/null
+++ b/mpeglib_artsplug/mpeglibartsplay.cpp
@@ -0,0 +1,276 @@
+// vim:ts=2:sw=2:sts=2:et
+/**
+ Starter for plugins.
+ The plugins are identified by their extension
+
+ .wav ->WavPlayObject
+ .mp3 ->MP3PlayObject
+ .mpg ->MPGPlayObject
+ .ogg ->OGGPlayObject
+*/
+
+
+#include "soundserver.h"
+#include "kmedia2.h"
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <vector>
+#include <string>
+#include <iostream>
+#include <climits>
+
+using namespace std;
+
+#if defined(HAVE_GETOPT_H)
+#include <getopt.h>
+#endif
+
+
+string file1;
+string file2;
+
+Arts::Dispatcher* d=0;
+Arts::SimpleSoundServer* server=0;
+
+
+
+void usage() {
+ cout << "mpeglibartsply command line tool for arts playobjects"<<endl;
+ cout << "Usage : mpeglibartsply [url]"<<endl;
+ cout << endl;
+ cout << "-1 : create/destroy PlayObject test."<<endl;
+ cout << "-2 : create/seek/play/destroy PlayObject test."<<endl;
+ cout << "-3 : torture seek implementation test"<<endl;
+ cout << "-h : help"<<endl;
+ cout << endl;
+ cout << "THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! " \
+ << "USE AT YOUR OWN RISK!"<<endl;
+ cout << endl;
+ exit(0);
+}
+
+
+void initServer() {
+ d=new Arts::Dispatcher();
+ server= new Arts::SimpleSoundServer (Arts::Reference("global:Arts_SimpleSoundServer"));
+
+ if(server->isNull()) {
+ cerr << "Can't connect to sound server" << endl;
+ exit(0);
+ }
+
+}
+
+
+void destroyServer() {
+ delete server;
+ delete d;
+}
+
+/**
+ create destroy playobjects without playing anything
+*/
+void doStress1() {
+ int cnt=0;
+ while (cnt < 10000) {
+ Arts::PlayObject play=server->createPlayObject(file1);
+ cout << "cnt:"<<cnt++<<endl;
+ }
+}
+
+/**
+ create playobjects playing some time, do seek play destroy
+*/
+void doStress2() {
+ int cnt=0;
+ while (cnt < 1000) {
+ Arts::PlayObject play=server->createPlayObject(file1);
+ play.play();
+ sleep(3);
+ Arts::poTime seekTime;
+ seekTime.seconds=100;
+ seekTime.ms=0;
+ play.seek(seekTime);
+ cout << "cnt:"<<cnt++<<endl;
+ }
+}
+
+/**
+ create playobject seek random play seek again
+*/
+void doStress3() {
+ int cnt=0;
+ Arts::PlayObject play=server->createPlayObject(file1);
+ play.play();
+ long secs=0;
+ while(1) {
+ cout << "waiting for length info.."<<endl;
+ sleep(3);
+ Arts::poTime length=play.overallTime();
+ secs=length.seconds;
+ if (secs > 0) break;
+ }
+ // do not jump near to end, the danger that
+ // we get an eof is to high
+ if (secs < 100) {
+ cout << "file to short for test"<<endl;
+ exit(-1);
+ }
+ secs-=10;
+ Arts::poTime seekTime;
+ Arts::poTime startTime;
+ startTime.seconds=0;
+ startTime.ms=0;
+
+ while (cnt < 1000) {
+
+ //
+ // seek to a know position
+ //
+ play.seek(startTime);
+ // now wait for seek completion we need a poll here
+ while(1) {
+ Arts::poTime current=play.currentTime();
+ if (current.seconds < 5) {
+ break;
+ }
+ usleep(50000);
+ }
+
+ //
+ // now we know that the playObject is near the beginning
+ //
+
+ int randNo=rand();
+ long seekPos=(long)(((float)randNo*(float)secs)/(float)RAND_MAX);
+ // need to jump over the start area
+
+ seekPos+=5;
+ cout << "seek to :"<<seekPos
+ << " | cnt:"<<cnt++
+ << " of 1000"<<endl;
+ seekTime.seconds=seekPos;
+ seekTime.ms=0;
+ play.seek(seekTime);
+ // now wait for seek completion we need a poll here
+ while(1) {
+ Arts::poTime current=play.currentTime();
+ if (current.seconds > seekPos) {
+ break;
+ }
+ if (current.seconds == seekPos) {
+ if (current.ms > 0) {
+ break;
+ }
+ }
+ usleep(50000);
+ }
+
+
+ }
+ cout << "stresstest successfully passed."<<endl;
+}
+
+
+int main(int argc, char **argv) {
+ int testNr=0;
+ int c;
+ initServer();
+
+ while(1) {
+ c = getopt (argc, argv, "123456h");
+ if (c == -1) break;
+ switch(c) {
+ case '1': {
+ testNr=1;
+ break;
+ }
+ case '2': {
+ testNr=2;
+ break;
+ }
+ case '3': {
+ testNr=3;
+ break;
+ }
+ case '4': {
+ testNr=4;
+ break;
+ }
+ case '5': {
+ testNr=5;
+ break;
+ }
+ case '6': {
+ testNr=5;
+ break;
+ }
+ case 'h': {
+ usage();
+ break;
+ }
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ usage();
+ exit(-1);
+ }
+ }
+
+ if (optind >= argc ) {
+ usage();
+ exit(-1);
+ }
+
+ if (optind < argc ) {
+ file1=argv[optind];
+ optind++;
+ file2=file1;
+ }
+ if (optind < argc ) {
+ file2=argv[optind];
+ }
+
+
+ switch(testNr) {
+ case 1: {
+ doStress1();
+ break;
+ }
+ case 2: {
+ doStress2();
+ break;
+ }
+ case 3: {
+ doStress3();
+ break;
+ }
+ default:
+ if (file1[0] != '/') {
+ char buf[PATH_MAX+1];
+ char *path = getcwd(buf, PATH_MAX - file1.length());
+ if (path) {
+ file1.insert(0, "/");
+ file1.insert(0, path);
+ }
+ }
+ Arts::PlayObject play=server->createPlayObject(file1);
+ if (play.isNull()) {
+ cout << "cannot play this"<<endl;
+ destroyServer();
+ exit(0);
+ }
+ play.play();
+ while (play.state() != Arts::posIdle) {
+ sleep(1);
+ }
+ }
+
+ destroyServer();
+}
+