comparison pidgin-audacious.c @ 21:83002f858ee9

- do not retract current song if playing has been paused. - little bit cleanup.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Sun, 05 Oct 2008 14:19:55 +0900
parents 4aa711530489
children fbad40babe88
comparison
equal deleted inserted replaced
20:4aa711530489 21:83002f858ee9
32 #include "cmds.h" 32 #include "cmds.h"
33 #include "savedstatuses.h" 33 #include "savedstatuses.h"
34 34
35 #define PIDGINAUD_PLUGIN_ID "pidgin_audacious" 35 #define PIDGINAUD_PLUGIN_ID "pidgin_audacious"
36 #define PLUGIN_NAME "Pidgin-Audacious" 36 #define PLUGIN_NAME "Pidgin-Audacious"
37
38 /* preferences */
37 #define OPT_PIDGINAUD "/plugins/pidgin_audacious" 39 #define OPT_PIDGINAUD "/plugins/pidgin_audacious"
38 #define OPT_PROCESS_STATUS OPT_PIDGINAUD "/process_status" 40 #define OPT_PROCESS_STATUS OPT_PIDGINAUD "/process_status"
39 #define OPT_PROCESS_USERINFO OPT_PIDGINAUD "/process_userinfo" 41 #define OPT_PROCESS_USERINFO OPT_PIDGINAUD "/process_userinfo"
40 #define OPT_SONG_TEMPLATE OPT_PIDGINAUD "/song_template" 42 #define OPT_SONG_TEMPLATE OPT_PIDGINAUD "/song_template"
41 #define OPT_PASTE_TEMPLATE OPT_PIDGINAUD "/paste_template" 43 #define OPT_PASTE_TEMPLATE OPT_PIDGINAUD "/paste_template"
42 #define OPT_LOG_OUTPUT OPT_PIDGINAUD "/log_output" 44 #define OPT_LOG_OUTPUT OPT_PIDGINAUD "/log_output"
43 #define OPT_PLAYER OPT_PIDGINAUD "/player" 45 #define OPT_PLAYER OPT_PIDGINAUD "/player"
44 46
47 /* templates */
48 #define TITLE "%title"
49 #define ARTIST "%artist"
50 #define ALBUM "%album"
51 #define GENRE "%genre"
45 #define DEFAULT_SONG_TEMPLATE "%title - %artist" 52 #define DEFAULT_SONG_TEMPLATE "%title - %artist"
46 #define DEFAULT_PLAYER "audacious" 53 #define DEFAULT_PLAYER "audacious"
47 #define SONG_TOKEN "%song" 54 #define SONG_TOKEN "%song"
48 #define NO_SONG_MESSAGE "No song being played." 55 #define NO_SONG_MESSAGE "No song being played."
49 56
50 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) 57 /* constants */
51 58 #define DBUS_TIMEOUT 1000
52 #define aud_debug(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_INFO, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); 59 #define PLAYING 0
53 60 #define PAUSED 1
54 #define aud_error(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_ERROR, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); 61 #define STOPPED 2
55 62
56 /* xxx move up */ 63 /* custom data type */
57 #define TITLE "%title"
58 #define ARTIST "%artist"
59 #define ALBUM "%album"
60 #define GENRE "%genre"
61
62 typedef struct song_tuple { 64 typedef struct song_tuple {
63 gchar *title; 65 gchar *title;
64 gchar *artist; 66 gchar *artist;
65 gchar *album; 67 gchar *album;
66 gchar *genre; 68 gchar *genre;
67 } song_tuple; 69 } song_tuple;
68 70
71 /* mpris data containers */
72 #define DBUS_TYPE_MPRIS_STATUS (dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
73
74 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
75
76 /* debug macros */
77 #define aud_debug(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_INFO, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0);
78
79 #define aud_error(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_ERROR, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0);
69 80
70 /* globals */ 81 /* globals */
71 static GHashTable *seed_status; 82 static GHashTable *seed_status;
72 static GHashTable *seed_userinfo; 83 static GHashTable *seed_userinfo;
73 static GHashTable *pushed_status; 84 static GHashTable *pushed_status;
87 static void signed_on_cb(PurpleConnection *gc, void *data); 98 static void signed_on_cb(PurpleConnection *gc, void *data);
88 static void prefs_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data); 99 static void prefs_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data);
89 100
90 101
91 /* implementation */ 102 /* implementation */
92
93 static DBusGProxy * 103 static DBusGProxy *
94 get_dbus_session(void) 104 get_dbus_session(void)
95 { 105 {
96 GError *error = NULL; 106 GError *error = NULL;
97 DBusGProxy *proxy; 107 DBusGProxy *proxy;
284 static void 294 static void
285 status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data) 295 status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data)
286 { 296 {
287 aud_debug("StatusChange %d\n", status); 297 aud_debug("StatusChange %d\n", status);
288 298
289 if (status != 0) { 299 switch(status) {
300 case STOPPED:
301 /* clear status/user info */
290 aud_process(NULL); 302 aud_process(NULL);
291
292 /* clear current song */ 303 /* clear current song */
293 purple_util_set_current_song(NULL, NULL, NULL); 304 purple_util_set_current_song(NULL, NULL, NULL);
294 305 break;
295 } 306 case PLAYING:
307 case PAUSED:
308 default:
309 break;
310 }
296 } 311 }
297 312
298 313
299 static void 314 static void
300 aud_process_status(PurpleConnection *gc, gchar *aud_info) 315 aud_process_status(PurpleConnection *gc, gchar *aud_info)
554 569
555 g_free(song); 570 g_free(song);
556 return PURPLE_CMD_RET_OK; 571 return PURPLE_CMD_RET_OK;
557 } 572 }
558 573
559 #define DBUS_TIMEOUT 1000
560 #define DBUS_TYPE_MPRIS_STATUS (dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
561
562 #define PLAYING 0
563 #define PAUSED 1
564 #define STOPPED 2
565
566 static gboolean 574 static gboolean
567 is_app_playing(void) 575 is_app_playing(void)
568 { 576 {
577 GError *error = NULL;
578 int status = STOPPED;
579
569 gchar *player_name = g_strconcat("org.mpris.", 580 gchar *player_name = g_strconcat("org.mpris.",
570 purple_prefs_get_string(OPT_PLAYER), 581 purple_prefs_get_string(OPT_PLAYER),
571 NULL); 582 NULL);
572
573 583
574 aud_debug("player_name = %s\n", player_name); 584 aud_debug("player_name = %s\n", player_name);
575 585
576 if(!session) { 586 if(!session) {
577 session = get_dbus_session(); 587 session = get_dbus_session();
578 connect_dbus_signals(); 588 connect_dbus_signals();
579 aud_debug("session == NULL. new session = %p\n", session); 589 aud_debug("session == NULL. new session = %p\n", session);
580 } 590 }
581 591
582 /* audacious only supports this form */ 592 /* audacious only supports this form */
583 GError *error = NULL;
584 int status = STOPPED;
585
586 gboolean result = 593 gboolean result =
587 dbus_g_proxy_call_with_timeout( 594 dbus_g_proxy_call_with_timeout(
588 session, 595 session,
589 "GetStatus", 596 "GetStatus",
590 DBUS_TIMEOUT, 597 DBUS_TIMEOUT,
593 G_TYPE_INT, 600 G_TYPE_INT,
594 &status, 601 &status,
595 G_TYPE_INVALID); 602 G_TYPE_INVALID);
596 603
597 aud_debug("GetStatus result = %d\n", result); 604 aud_debug("GetStatus result = %d\n", result);
598 605 aud_debug("GetStatus status = %d\n", status);
599 if(status == PLAYING || status == PAUSED) 606
607 switch(status) {
608 case PLAYING:
609 case PAUSED:
600 return TRUE; 610 return TRUE;
601 else 611 break;
612 case STOPPED:
613 default:
602 return FALSE; 614 return FALSE;
603 615 break;
604 aud_debug("GetStatus status = %d\n", status); 616 }
605 617
606 618 #if 0
607 /* mpris specification 1.0 insists this is the way. no player 619 /* mpris specification 1.0 insists this is the way. no player
608 * supports this at this time. --yaz */ 620 * supports this at this time. --yaz */
609 #if 0
610 GError *error = NULL; 621 GError *error = NULL;
611 GValueArray *s; 622 GValueArray *s;
612 gboolean result = 623 gboolean result =
613 dbus_g_proxy_call_with_timeout( 624 dbus_g_proxy_call_with_timeout(
614 session, 625 session,
628 int status = g_value_get_int(val); 639 int status = g_value_get_int(val);
629 g_value_array_free(s); 640 g_value_array_free(s);
630 641
631 aud_debug("status = %d\n", status); 642 aud_debug("status = %d\n", status);
632 643
633 if(status == STOPPED) 644 switch(status) {
645 case PLAYING:
646 case PAUSED:
647 return TRUE;
648 break;
649 case STOPPED:
650 default:
634 return FALSE; 651 return FALSE;
635 else
636 return TRUE;
637 } 652 }
638 653
639 return FALSE; 654 return FALSE;
640 #endif 655 #endif
641
642 } 656 }
643 657
644 static void 658 static void
645 signed_on_cb(PurpleConnection *gc, void *data) 659 signed_on_cb(PurpleConnection *gc, void *data)
646 { 660 {
709 connect_dbus_signals(); 723 connect_dbus_signals();
710 724
711 /* connect to purple signals */ 725 /* connect to purple signals */
712 connect_purple_signals(plugin); 726 connect_purple_signals(plugin);
713 727
728 /* clear status */
714 status_signal_cb(NULL, -1, NULL); 729 status_signal_cb(NULL, -1, NULL);
715
716 730
717 /* register /song command */ 731 /* register /song command */
718 cmdid_paste_current_song = 732 cmdid_paste_current_song =
719 purple_cmd_register("song", "", PURPLE_CMD_P_DEFAULT, 733 purple_cmd_register("song", "", PURPLE_CMD_P_DEFAULT,
720 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_CHAT, 734 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_CHAT,