diff --git a/dbus_client.c b/dbus_client.c index d13ae45..1b7ad72 100644 --- a/dbus_client.c +++ b/dbus_client.c @@ -196,7 +196,7 @@ void dbusStop( DBusConnection *conn, const char *player ) { dbus_message_unref( msg ); } -bool dbusStatus( DBusConnection *conn, const char *player ) { +char *dbusStatus( DBusConnection *conn, const char *player ) { DBusMessageIter args; DBusMessageIter string; DBusMessage *msg = NULL; @@ -208,9 +208,23 @@ bool dbusStatus( DBusConnection *conn, const char *player ) { char *meta = NULL; dbus_message_iter_recurse( &args, &string ); dbus_message_iter_get_basic( &string, &meta ); - bool ret = strcmp( meta, "Playing" ) == 0; - ret |= strcmp( meta, "Paused" ) == 0; + char *ret = strdup( meta ); // free reply dbus_message_unref( msg ); return ret; } + +bool dbusRunning( DBusConnection *conn, const char *player ) { + char *status = dbusStatus( conn, player ); + bool ret = strcmp( status, "Playing" ) == 0; + ret |= strcmp( status, "Paused" ) == 0; + free( status ); + return ret; +} + +bool dbusPlaying( DBusConnection *conn, const char *player ) { + char *status = dbusStatus( conn, player ); + bool ret = strcmp( status, "Playing" ) == 0; + free( status ); + return ret; +} diff --git a/dbus_client.h b/dbus_client.h index 10d0995..ee8b50d 100644 --- a/dbus_client.h +++ b/dbus_client.h @@ -13,6 +13,7 @@ void dbusPlayPause( DBusConnection *conn, const char *player ); void dbusNext( DBusConnection *conn, const char *player ); void dbusPrev( DBusConnection *conn, const char *player ); void dbusStop( DBusConnection *conn, const char *player ); -bool dbusStatus( DBusConnection *conn, const char *player ); +bool dbusRunning( DBusConnection *conn, const char *player ); +bool dbusPlaying( DBusConnection *conn, const char *player ); #endif diff --git a/main.c b/main.c index 13da867..e194db1 100644 --- a/main.c +++ b/main.c @@ -60,7 +60,7 @@ int main( int argc, char **argv ) { if ( requests & SONG_FLAG || requests & META_FLAG ) { struct song_metadata song = { 0 }; - if ( sources & MPD_FLAG ) { + if ( sources & MPD_FLAG && mpdPlaying( mpd_connection ) ) { song = mpdGetSong( mpd_connection ); if ( requests & SONG_FLAG ) printSong( &song ); @@ -70,6 +70,8 @@ int main( int argc, char **argv ) { if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { + if( !dbusPlaying( dbus_connection, *player ) ) + continue; song = dbusGetSong( dbus_connection, *player ); if ( requests & SONG_FLAG ) printSong( &song ); @@ -81,11 +83,11 @@ int main( int argc, char **argv ) { if( requests & RUNNING_FLAG ) { ret = EXIT_FAILURE; - if( sources & MPD_FLAG && mpdStatus( mpd_connection ) ) + if( sources & MPD_FLAG && mpdRunning( mpd_connection ) ) ret = EXIT_SUCCESS; if( sources & DBUS_FLAG ) { for( char **player = dbus_players; *player; ++player ) { - if( dbusStatus( dbus_connection, *player ) ) + if( dbusRunning( dbus_connection, *player ) ) ret = EXIT_SUCCESS; } } diff --git a/mpd_client.c b/mpd_client.c index 835c08c..e503d5f 100644 --- a/mpd_client.c +++ b/mpd_client.c @@ -65,11 +65,21 @@ void mpdStop( struct mpd_connection *mpd_connection ) { mpd_send_stop( mpd_connection ); } -bool mpdStatus( struct mpd_connection *mpd_connection ) { +enum mpd_state mpdStatus( struct mpd_connection *mpd_connection ) { struct mpd_status *status = mpd_run_status( mpd_connection ); if( status == NULL ) - return false; + return -1; enum mpd_state ret = mpd_status_get_state( status ); mpd_status_free( status ); - return ret != MPD_STATE_STOP && ret != MPD_STATE_UNKNOWN; + return ret; +} + +bool mpdRunning( struct mpd_connection *mpd_connection ) { + enum mpd_state state = mpdStatus( mpd_connection ); + return state != MPD_STATE_STOP && state != MPD_STATE_UNKNOWN; +} + +bool mpdPlaying( struct mpd_connection *mpd_connection ) { + enum mpd_state state = mpdStatus( mpd_connection ); + return state == MPD_STATE_PLAY; } diff --git a/mpd_client.h b/mpd_client.h index 0c50622..b13db26 100644 --- a/mpd_client.h +++ b/mpd_client.h @@ -10,4 +10,5 @@ void mpdPlayPause( struct mpd_connection *mpd_connection ); void mpdNext( struct mpd_connection *mpd_connection ); void mpdPrev( struct mpd_connection *mpd_connection ); void mpdStop( struct mpd_connection *mpd_connection ); -bool mpdStatus( struct mpd_connection *mpd_connection ); +bool mpdRunning( struct mpd_connection *mpd_connection ); +bool mpdPlaying( struct mpd_connection *mpd_connection );