void xmms_remote_set_main_volume(int session, int v) { int b, vl, vr; b = xmms_remote_get_balance(session); v = CLAMP(v, 0, 100); if (b < 0) { vl = v; vr = rint((v * (100 + b)) / 100.0); } else if (b > 0) { vl = rint((v * (100 - b)) / 100.0); vr = v; } else vl = vr = v; xmms_remote_set_volume(session, vl, vr); }
/* * Callback funtion to handle delayed display. */ static gint timeout_func(gpointer data) { gint pos, volume, balance; gboolean playing, paused, repeat, shuffle; gchar *text; if (!osd) return FALSE; GDK_THREADS_ENTER(); pos = xmms_remote_get_playlist_pos (gp.xmms_session); playing = xmms_remote_is_playing (gp.xmms_session); paused = xmms_remote_is_paused (gp.xmms_session); volume = xmms_remote_get_main_volume (gp.xmms_session); shuffle = xmms_remote_is_shuffle (gp.xmms_session); repeat = xmms_remote_is_repeat (gp.xmms_session); balance = (xmms_remote_get_balance(gp.xmms_session) + 100) / 2; /** * Check if the position of the current song has changed. * DTM: bugfix * 1) 'get_playlist_time' seems "variable" for a song, don't use it * 2) we must free the titles we download */ if (pos != previous_song) { if (xmms_remote_get_playlist_length (gp.xmms_session)) /* otherwise it'll crash */ { text = xmms_remote_get_playlist_title (gp.xmms_session, pos); if (text) replace_hexcodes (text); /** * Check to see if the title of the song has changed. */ if ( !previous_title || g_strcasecmp(text, previous_title) != 0 ) { if (show_stop) { xosd_display (osd, 0, XOSD_string, playing ? "Play" : "Stopped"); xosd_display (osd, 1, XOSD_string, text); } save_previous_title( text ); } } else { /** No song titles available. */ if (show_stop) { xosd_display (osd, 0, XOSD_string, playing ? "Play" : "Stopped"); } save_previous_title( 0 ); } previous_song = pos; } else if (playing != previous_playing ) { if (playing && show_trackname) { xosd_display (osd, 0, XOSD_string, "Play"); text = xmms_remote_get_playlist_title (gp.xmms_session, pos); if (text) { replace_hexcodes (text); xosd_display (osd, 1, XOSD_string, text); save_previous_title ( text ); } } else if (!playing && show_stop ) { xosd_display (osd, 0, XOSD_string, "Stop"); xosd_display (osd, 1, XOSD_string, ""); } previous_playing = playing; } else if (paused != previous_paused && show_pause) { if (paused) { xosd_display (osd, 0, XOSD_string, "Paused"); xosd_display (osd, 1, XOSD_string, ""); } else { xosd_display (osd, 0, XOSD_string, "Unpaused"); text = xmms_remote_get_playlist_title (gp.xmms_session, pos); if (text) { replace_hexcodes (text); xosd_display (osd, 1, XOSD_string, text); save_previous_title( text ); } } previous_paused = paused; } else if (volume != previous_volume && show_volume) { xosd_display (osd, 0, XOSD_string, "Volume"); xosd_display (osd, 1, XOSD_percentage, volume); previous_volume = volume; } else if (balance != previous_balance && show_balance) { xosd_display (osd, 0, XOSD_string, "Balance"); xosd_display (osd, 1, XOSD_slider, balance); previous_balance = balance; } else if (repeat != previous_repeat && show_repeat ) { xosd_display (osd, 0, XOSD_string, "Repeat"); xosd_display (osd, 1, XOSD_string, repeat ? "On" : "Off"); previous_repeat = repeat; } else if (shuffle != previous_shuffle && show_shuffle ) { xosd_display (osd, 0, XOSD_string, "Shuffle"); xosd_display (osd, 1, XOSD_string, shuffle ? "On" : "Off"); previous_shuffle = shuffle; } GDK_THREADS_LEAVE(); return TRUE; }