UniversalMusicController/main.c

135 lines
4.1 KiB
C
Raw Normal View History

2020-05-29 12:21:05 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "metadata.h"
#include "dbus_client.h"
#include "mpd_client.h"
2020-05-29 18:27:46 +00:00
#define SONG_FLAG 0x0001
#define META_FLAG 0x0002
#define RUNNING_FLAG 0x0004
2020-05-29 18:36:54 +00:00
#define NEXT_FLAG 0x0008
#define PREV_FLAG 0x0010
#define PLAY_FLAG 0x0020
2020-05-29 18:27:46 +00:00
#define MPD_FLAG 0x0001
#define DBUS_FLAG 0x0002
void parseCommandLine( int argc, char **argv, size_t *requests,
size_t *sources ) {
for ( int i = 1; i < argc; i++ ) {
if ( !strcmp( argv[i], "song" ) )
*requests |= SONG_FLAG;
else if ( !strcmp( argv[i], "info" ) )
*requests |= META_FLAG;
else if ( !strcmp( argv[i], "status" ) )
*requests |= RUNNING_FLAG;
2020-05-29 18:36:54 +00:00
else if ( !strcmp( argv[i], "next" ) )
*requests |= NEXT_FLAG;
else if ( !strcmp( argv[i], "prev" ) || !strcmp( argv[i], "previous" ) )
*requests |= PREV_FLAG;
else if ( !strcmp( argv[i], "play" ) || !strcmp( argv[i], "pause" ) )
*requests |= PLAY_FLAG;
2020-05-29 18:27:46 +00:00
else if ( !strcmp( argv[i], "mpd" ) )
*sources |= MPD_FLAG;
else if ( !strcmp( argv[i], "dbus" ) )
*sources |= DBUS_FLAG;
2020-05-29 12:21:05 +00:00
}
2020-05-29 18:27:46 +00:00
if ( *sources == 0 )
*sources = MPD_FLAG | DBUS_FLAG;
}
int main( int argc, char **argv ) {
size_t requests = 0, sources = 0;
int ret = EXIT_SUCCESS;
parseCommandLine( argc, argv, &requests, &sources );
DBusConnection *dbus_connection = NULL;
char **dbus_players = NULL;
struct mpd_connection *mpd_connection = NULL;
if ( sources & MPD_FLAG )
mpd_connection = mpdConnect( 6600 );
if ( sources & DBUS_FLAG ) {
dbus_connection = dbusConnect();
dbus_players = dbusGetMediaPlayers( dbus_connection );
}
if ( requests & SONG_FLAG || requests & META_FLAG ) {
struct song_metadata song = { 0 };
2020-05-29 18:45:39 +00:00
if ( sources & MPD_FLAG && mpdPlaying( mpd_connection ) ) {
2020-05-29 18:27:46 +00:00
song = mpdGetSong( mpd_connection );
if ( requests & SONG_FLAG )
printSong( &song );
if ( requests & META_FLAG )
printMeta( &song );
}
if ( sources & DBUS_FLAG ) {
for ( char **player = dbus_players; *player; ++player ) {
2020-05-29 18:45:39 +00:00
if( !dbusPlaying( dbus_connection, *player ) )
continue;
2020-05-29 18:27:46 +00:00
song = dbusGetSong( dbus_connection, *player );
if ( requests & SONG_FLAG )
printSong( &song );
if ( requests & META_FLAG )
printMeta( &song );
}
}
2020-05-29 18:53:27 +00:00
freeSong( &song );
2020-05-29 18:27:46 +00:00
}
2020-05-29 12:21:05 +00:00
2020-05-29 18:27:46 +00:00
if( requests & RUNNING_FLAG ) {
ret = EXIT_FAILURE;
2020-05-29 18:45:39 +00:00
if( sources & MPD_FLAG && mpdRunning( mpd_connection ) )
2020-05-29 18:27:46 +00:00
ret = EXIT_SUCCESS;
if( sources & DBUS_FLAG ) {
for( char **player = dbus_players; *player; ++player ) {
2020-05-29 18:45:39 +00:00
if( dbusRunning( dbus_connection, *player ) )
2020-05-29 18:27:46 +00:00
ret = EXIT_SUCCESS;
}
}
2020-05-29 12:21:05 +00:00
}
2020-05-29 18:36:54 +00:00
if( requests & NEXT_FLAG ) {
if( sources & MPD_FLAG )
mpdNext( mpd_connection );
if( sources & DBUS_FLAG ) {
for( char **player = dbus_players; *player; ++player ) {
dbusNext( dbus_connection, *player );
}
}
}
if( requests & PREV_FLAG ) {
if( sources & MPD_FLAG )
mpdPrev( mpd_connection );
if( sources & DBUS_FLAG ) {
for( char **player = dbus_players; *player; ++player ) {
dbusPrev( dbus_connection, *player );
}
}
}
if( requests & PLAY_FLAG ) {
if( sources & MPD_FLAG )
mpdPlayPause( mpd_connection );
if( sources & DBUS_FLAG ) {
for( char **player = dbus_players; *player; ++player ) {
dbusPlayPause( dbus_connection, *player );
}
}
}
2020-05-29 18:53:27 +00:00
if( sources & DBUS_FLAG ) {
dbusFreePlyaers( dbus_players );
dbusDisconnect( dbus_connection );
}
if( sources & MPD_FLAG ) {
mpdDisconnect( mpd_connection );
}
2020-05-29 12:21:05 +00:00
2020-05-29 18:27:46 +00:00
return ret;
2020-05-29 12:21:05 +00:00
}