Bon, reprenons. Après avoir joué avec la configuration cachée de rhythmbox, j’ai trouvé une politique de mélange satisfaisante. Malheureusement, à chaque fois qu’on active/désactive la lecture aléatoire, cette préférence disparaît. Autant dire que c’est intolérable, et qu’il va vraiment falloir mettre les mains dans le cambouis. Reprenons donc où nous en étions précédemment.
Écriture du patch
Vu que de nombreuses politiques sont possibles, mais qu’on retombe toujours sur la même en passant en mode aléatoire, c’est forcément quelque part en dur dans le code. Commençons par trouver quel callback gère l’activation du mode aléatoire.
Dans rb-shell-player.c, on trouve l’initialisation du menu « Contrôle », la définition du raccourci clavier, et… le fameux callback :
static GtkToggleActionEntry rb_shell_player_toggle_entries [] = { { "ControlPlay", GTK_STOCK_MEDIA_PLAY, N_("_Play"), "<control>space", N_("Start playback"), G_CALLBACK (rb_shell_player_cmd_play) }, { "ControlShuffle", GNOME_MEDIA_SHUFFLE, N_("Sh_uffle"), "<control>U", N_("Play songs in a random order"), G_CALLBACK (rb_shell_player_shuffle_changed_cb) }, { "ControlRepeat", GNOME_MEDIA_REPEAT, N_("_Repeat"), "<control>R", N_("Play first song again after all songs are played"), G_CALLBACK (rb_shell_player_repeat_changed_cb) }, { "ViewSongPositionSlider", NULL, N_("_Song Position Slider"), NULL, N_("Change the visibility of the song position slider"), G_CALLBACK (rb_shell_player_view_song_position_slider_changed_cb), TRUE }, };
Dans le même fichier, un peu plus loin, on tombe sur la définition de la fonction rb_shell_player_shuffle_changed_cb. Son fonctionnement est assez simple : elle lit l’état d’activation, l’inverse, et applique une politique définie par deux états d’activation :
- la lecture aléatoire ;
- la lecture en boucle.
Cette fonction est codée sous la forme d’une table d’association à deux dimensions, appelée state_to_play_order, que l’on retrouve en tête de fichier :
static const char* const state_to_play_order[2][2] = {{"linear", "linear-loop"}, {"shuffle", "random-by-age-and-rating"}};
Il suffit donc de changer « shuffle » par « random-by-age », et le tour devrait être joué.
Pour faire le patch, il faut d’abord copier le fichier d’origine, modifier le fichier comme décrit, puis utiliser la commande diff :
# cp rb-shell-player.c rb-shell-player.c.shuffle # ... édition de rb-shell-player.c ... # diff -up rb-shell-player.c.shuffle rb-shell-player.c > ../../rb-better-use-random-by-age.patch
Modification du fichier SPEC
Il faut maintenant ajouter notre patch à la liste des patchs à appliquer lors de la construction du RPM de rhythmbox. Il va également falloir trouver un numéro de version pour le RPM qui devra permettre de mettre à jour la version officielle, sans rentrer en conflit avec les numéros des prochaines versions officielles. Le plus simple est encore de suffixer le numéro de version du RPM bâtit, par exemple en le passant de 4 à 4.1.
En vert, voici les modifications appliquées à rhythmbox.spec :
Version: 0.12.8 Release: 4.1%{?dist} License: GPLv2+ with exceptions and GFDL ... Patch2: 0001-Don-t-load-AFC-devices-using-the-MTP-plugin.patch Patch3: rb-better-use-random-by-age.patch ... %patch2 -p1 -b .no-mtp-for-afc %patch3 -p1 -b .shuffle ...
Construction du nouveau RPM, publication, et fin
Il n’y a plus qu’à finaliser tout ceci en produisant le RPM patché :
# rpmbuild -ba --clean --sign SPECS/rhythmbox.spec
puis en ajoutant le nouveau RPM à votre dépôt. La prochaine mise-à-jour yum fera le reste.
#1 par seventh à 7 juillet 2010 - 21 h 47 min
Citation
À noter aussi qu’avec la version d’origine, il suffit d’activer également la lecture en boucle pour bénéficier d’une lecture aléatoire mieux distribuée. Ça non plus, ça n’est pas documenté !