mplayerを操作する

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>

static FILE *mplayer=NULL;
#define FIFO "fifo"
#define ERROR -1
#define SUCCESS 0
#define BUFSIZE 256


/**
 * 文字列があるか検索
 */
bool find_str( const char *from , const char *pat )
{
	if( strlen( from ) <  strlen( pat ) ){
		return false;
	}
	if( strstr( from , pat ) != NULL ){
		return true;
	}else{
		return false;
	}
}

/**
 * mplayerのfifoへコマンドを送信する
 */
int send_command( char *com )
{
	FILE *f = fopen( FIFO , "w" );
	if( f == NULL ){
		char buf[BUFSIZE];
		memset( buf , 0 , BUFSIZE );
		sprintf( buf , "command %s fifo open failed.\n" , com );
		perror( buf );
		return ERROR;
	}
	int r = fputs( com , f );
	if( r == EOF ){
		char buf[BUFSIZE];
		memset( buf , 0 , BUFSIZE );
		sprintf( buf , "command %s send failed.\n" , com );
		perror( buf );
		return ERROR;
	}
	fclose( f );
	return SUCCESS;
}

/**
 * mplayerの出力からfifoへコマンドを送信する
 */
int get_reply( char *reply , char *wait )
{
	char buf[BUFSIZE];
	while(true){
		memset( buf , 0 , BUFSIZE );
		fgets( buf , BUFSIZE , mplayer );
		printf( "read line - %s ", buf );
		if( find_str( buf , wait ) == true ){
			strcpy( reply , buf );
			break;
		}
	}
	return SUCCESS;
}

/**
 * mplayerを開始する
 */
int mplayer_start()
{
	mplayer = popen("mplayer -slave -idle -quiet -input file=fifo" , "r" );
	if( mplayer == NULL ){
		perror("mplayer start failed\n");
		return ERROR;
	}else{
		return SUCCESS;
	}
}

/**
 * file を再生する
 */
int mplayer_play( char *file )
{
	char buf[BUFSIZE];
	memset( buf , 0 , BUFSIZE );
	sprintf( buf , "loadfile %s\n" , file );
	return send_command( buf );
}

int mplayer_get_time_length( double *len )
{
	char *com="get_time_length\n";
	int r = send_command( com );
	if( r == ERROR ){
		return r;
	}
	char buf[BUFSIZE];
	char *wait = "ANS_LENGTH=";
	r = get_reply( buf , wait );
	*len = 0.0;
	sscanf( buf , "ANS_LENGTH=%lf\n" , len  ); 
	return r;
}

int mplayer_get_time_pos( double *pos )
{
	char *com="get_time_pos\n";
	int r = send_command( com );
	if( r == ERROR ){
		return r;
	}
	char buf[BUFSIZE];
	char *wait = "ANS_TIME_POSITION=";
	r = get_reply( buf , wait );
	*pos = 0.0;
	sscanf( buf , "ANS_TIME_POSITION=%lf\n" , pos  ); 
	return r;
}

int mplayer_seek_relative( int sec )
{
	char buf[BUFSIZE];
	memset( buf , 0 , BUFSIZE );
	if( sec > 0 ){
		sprintf( buf , "seek +%d 0\n" , sec );
	}else{
		sprintf( buf , "seek %d 0\n" , sec );
	}
	printf( "seek command %s " , buf ); 
	return send_command( buf );
}

int mplayer_seek_percent( double percent )
{
	char buf[BUFSIZE];
	memset( buf , 0 , BUFSIZE );
	sprintf( buf , "seek %'.2f 1\n" , percent );
	printf( "seek command %s " , buf ); 
	return send_command( buf );
}

/**
 * mplayer を停止する
 */
int mplayer_quit()
{
	char *com = "q\n";
	int r = send_command( com );
	sleep( 3 );
	if( mplayer != NULL ){
		pclose( mplayer );
		mplayer = NULL;
	}
	return r;
}

int mplayer_set_fullscreen()
{
	char *com="vo_fullscreen 1\n";
	return send_command( com );
}


int main( int argc , char** args )
{
	mplayer_start();
	sleep( 2 );
	mplayer_play("sample.mp4");
	sleep( 2 );
	double time;
	mplayer_get_time_length( &time );
	sleep( 2 );
	double pos;
	mplayer_get_time_pos( &pos );
	sleep( 2 );
	mplayer_seek_percent( 50.0 );
	sleep( 2 );
	mplayer_seek_relative( 5 );
	sleep( 2 );
	mplayer_set_fullscreen();
	sleep( 15 );
	mplayer_quit();
	return SUCCESS;
}