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.
277 lines
5.0 KiB
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();
|
|
}
|
|
|