You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/mpeglib_artsplug/mpeglibartsplay.cpp

277 lines
5.0 KiB

// 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();
}