/*************************************************************************** * Copyright (C) 2003 by Hans Karlsson * * karlsson.h@home.se * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include "xmmssensor.h" #ifdef HAVE_XMMS #include class XMMSSensor::XMMS { public: XMMS() : libxmms( 0 ) { libxmms = new TQLibrary( "xmms.so.1" ); if ( !libxmms->load() ) { delete libxmms; libxmms = 0; } if ( libxmms != 0 ) { // resolve functions *(void**) (&xmms_remote_is_running) = libxmms->resolve( "xmms_remote_is_running" ); *(void**) (&xmms_remote_is_playing) = libxmms->resolve( "xmms_remote_is_playing" ); *(void**) (&xmms_remote_get_playlist_title) = libxmms->resolve( "xmms_remote_get_playlist_title" ); *(void**) (&xmms_remote_get_playlist_time) = libxmms->resolve( "xmms_remote_get_playlist_time" ); *(void**) (&xmms_remote_get_playlist_pos) = libxmms->resolve( "xmms_remote_get_playlist_pos" ); *(void**) (&xmms_remote_get_output_time) = libxmms->resolve( "xmms_remote_get_output_time" ); } } bool isInitialized() const { return libxmms != 0 && xmms_remote_is_running != 0 && xmms_remote_is_playing != 0 && xmms_remote_get_playlist_title != 0 && xmms_remote_get_playlist_time != 0 && xmms_remote_get_playlist_pos != 0 && xmms_remote_get_output_time != 0; } bool isRunning(int session) { if ( !isInitialized() ) return false; return (*xmms_remote_is_running)(session); } bool isPlaying(int session) { if ( !isInitialized() ) return false; return (*xmms_remote_is_playing)(session); } char* getPlaylistTitle(int session, int pos) { if ( !isInitialized() ) return ""; return (*xmms_remote_get_playlist_title)(session, pos); } int getPlaylistTime(int session, int pos) { if ( !isInitialized() ) return 0; return (*xmms_remote_get_playlist_time)(session, pos); } int getPlaylistPos(int session) { if ( !isInitialized() ) return 0; return (*xmms_remote_get_playlist_pos)(session); } int getOutputTime(int session) { if ( !isInitialized() ) return 0; return (*xmms_remote_get_output_time)(session); } private: TQLibrary* libxmms; bool (*xmms_remote_is_running)(int); bool (*xmms_remote_is_playing)(int); char* (*xmms_remote_get_playlist_title)(int, int); int (*xmms_remote_get_playlist_time)(int, int); int (*xmms_remote_get_playlist_pos)(int); int (*xmms_remote_get_output_time)(int); }; #else // No XMMS class XMMSSensor::XMMS { public: XMMS() {} bool isInitialized() const { return false; } }; #endif // HAVE_XMMS XMMSSensor::XMMSSensor( int interval, const TQString &encoding ) : Sensor( interval ), xmms( 0 ) { if( !encoding.isEmpty() ) { codec = TQTextCodec::codecForName( encoding.ascii() ); if ( codec == 0) codec = TQTextCodec::codecForLocale(); } else codec = TQTextCodec::codecForLocale(); xmms = new XMMS(); } XMMSSensor::~XMMSSensor() { delete xmms; } void XMMSSensor::update() { TQString format; SensorParams *sp; Meter *meter; TQObjectListIt it( *objList ); #ifdef HAVE_XMMS int pos; TQString title; int songLength = 0; int currentTime = 0; bool isPlaying = false; bool isRunning = xmms->isRunning(0); if( isRunning ) { isPlaying = xmms->isPlaying(0); pos = xmms->getPlaylistPos(0); tqDebug("unicode start"); title = codec->toUnicode( TQCString( xmms->getPlaylistTitle( 0, pos ) ) ); tqDebug("unicode end"); if( title.isEmpty() ) title = "XMMS"; tqDebug("Title: %s", title.ascii()); songLength = xmms->getPlaylistTime( 0, pos ); currentTime = xmms->getOutputTime( 0 ); } #endif // HAVE_XMMS while (it != 0) { sp = (SensorParams*)(*it); meter = sp->getMeter(); #ifdef HAVE_XMMS if( isRunning ) { format = sp->getParam("FORMAT"); if (format.length() == 0 ) { format = "%title %time / %length"; } if( format == "%ms" ) { meter->setMax( songLength ); meter->setValue( currentTime ); } else if ( format == "%full" ) { meter->setValue( 1 ); } else { format.replace( TQRegExp("%title", false), title ); format.replace( TQRegExp("%length", false), TQTime( 0,0,0 ). addMSecs( songLength ) .toString( "h:mm:ss" ) ); format.replace( TQRegExp("%time", false), TQTime( 0,0,0 ). addMSecs( currentTime ) .toString( "h:mm:ss" ) ); if( isPlaying ) { format.replace( TQRegExp("%remain", false), TQTime( 0,0,0 ). addMSecs( songLength ) .addMSecs(-currentTime ) .toString( "h:mm:ss" ) ); } else { format.replace( TQRegExp("%remain", false), TQTime( 0,0,0 ).toString("h:mm:ss" ) ); } meter->setValue(format); } } else #endif // HAVE_XMMS { meter->setValue(""); } ++it; } } void XMMSSensor::setMaxValue( SensorParams *sp) { Meter *meter; meter = sp->getMeter(); TQString f; f = sp->getParam("FORMAT"); if ( f == "%full" ) meter->setMax( 1 ); } bool XMMSSensor::hasXMMS() const { return xmms->isInitialized(); } #include "xmmssensor.moc"