Je vais présenter ici quelques fonctions utiles. Pour des questions de faciliter, j'ai créé deux nouvelles méthodes pour le module TagLib bien qu'elles n'aient rien avoir avec taglib.
rb_define_singleton_method(mTagLib, "block", block, 0);
La méthode TagLib.block ne prend aucun paramètre, mais un bloc doit lui être fourni. Elle exécute ce bloc en lui passant comme argument l'objet TagLib et retourne le bloc sous la forme d'un Proc.
$ make
$ irb
> require './lib/taglib2.rb'
=> true
TagLib.block{|a| p a}
TagLib
=> #<Proc:0xb75ba510@(irb):2>
Voici la fonction implémentant ce comportement.
VALUE
block(VALUE self)
{
rb_yield(self);
return rb_block_proc();
}
rb_yield permet d'appeler le bloc passé à la méthode alors que rb_block_proc permet de le manipuler sous la forme d'un Proc.
Je propose d'écrire l'équivalent de code écrit en ruby.
def TagLib.n(tab=["Salut", "Re"])
tab.to_a
tab.each{|s| $stdout.puts s}
tab[0]
end
rb_define_singleton_method(mTagLib, "n", n, -1);
Le dernier argument lors de la déclaration de la méthode TagLib.n vaut -1 ce qui indique que la méthode ne possède pas un nombre d'arguments fixees. La fonction rb_scan_args permet de récupérer de manière propre les paramètres passés à la méthode. Le troisième argument de cette fonction est une chaîne de caractère représentant deux chiffres. Le premier indique le nombre de paramètres obligatoires, le second indique le nombre de paramètres optionnels.
VALUE
n1(VALUE str)
{
return rb_funcall(rb_stdout, rb_intern("puts"), 1, str);
}
VALUE
n(int argc, VALUE* argv, VALUE self)
{
VALUE tab;
rb_scan_args(argc, argv, "01", &tab);
if (NIL_P(tab))
tab=rb_ary_new3(2, rb_str_new2("Salut"), rb_str_new2("Re"));
rb_funcall(tab, rb_intern("to_a"), 0);
rb_iterate(rb_each, tab, n1, Qnil);
return RARRAY(tab)->ptr[0];
}
TagLib.n peut donc être appelée avec un paramètre ou sans. Si aucun argument n'a été passé (tab=nil), tab est initialisé en créant un tableau contenant deux objets String. On vérifie ensuite que tab appartient à la classe Array ou s'en rapproche (duck typing). rb_funcall permet d'appeler une méthode (deuxième argument) d'un objet (premier argument) avec un certain nombre (troisième argument) de paramètres (arguments suivant). rb_intern permet d'obtenir la méthode à partir d'une chaîne de caractères.
La fonction n1 est ensuite appelé pour chacun des éléments du tableau grâce à rb_iterate. LA méthode retourne, finalement, le premier élément de tab, la macro RARRAY permettant d'accéder à la structure interne d'un objet de la classe Array, le champ ptr permettant d'accéder aux éléments.
> TagLib.n
Salut
Re
=> "Salut"
> TagLib.n(["Bonjour"])
Bonjour
=> "Bonjour"
Quelques liens qui m'ont aidé à écrire des extensions pour ruby en C :
le fichier README.EXt fourni avec ruby,
ruby-doc.
En ce qui concerne taglib :
l'exemple dans les sources de taglib,
le fichier bindings/c/tag_c.h.
Le code, présenté dans ces billets, implémentant le module, TagLib est téléchargeable ici.
Cette série d'articles est finie. J'espère qu'ils vous seront utiles.
Vous devez être identifié pour poster un commentaire.
Ce quatrième billet présente comment obtenir une documentation grâce à rdoc : il suffit de commenter les fichiers sources.
Pour documenter les méthodes de la classe TagLib::File, il suffit de commenter les différentes fonctions les implémentant.
La méthode title permet d'obtenir le titre d'une piste. On l'indique en commentaire juste avant la fonction file_get_title.
/*Get track title*/
VALUE
file_get_title(VALUE self)
Par défaut, les paramètres d'une méthode sont nommés p1, p2, .... Pour la méthode title=, on utilise l'instruction call-seq: pour afficher le texte title=title (au lieu de title=(p1)).
/*
call-seq: title=title
Set track title to title
title: a string
*/
VALUE
file_set_title(VALUE self, VALUE title)
La méthode initialize ne devrait jamais être appelée directement depuis un code ruby. On utilise l'instruction :nodoc: pour indiquer que la méthode ne doit pas apparaitre dans la documentation.
/*:nodoc:*/
VALUE
file_init(VALUE self, VALUE path)
J'indique que je ne désire pas commenter le module TagLib en plaçant un commentaire vide afin d'éviter que rdoc utilise un commentaire non-désiré.
/* */
mTagLib=rb_define_module("TagLib");
Dans le fichier lib/raglib2.rb, j'ajoute la directive :main: afin que la page initiale de la documentation pointe sur la classe TagLib::File.
#:main: TagLib::File
module TagLib
Bizarrement, cette directive ne semble pas fonctionner si elle est placée dans le fichier taglib2.c.
rdoc --exclude extconf.rb
Le fichier doc/index.html est créé.

Rendez-vous pour le dernier billet où j'introduirai quelques concepts que je n'ai pas utilisé dans le module TagLib.
Vous devez être identifié pour poster un commentaire.
Cet article fait suite au premier et deuxième billets dans lesquels nous avons vu comment créer un objet de la classe TagLib::File. Cet objet utilise les fonctions de la bibliothèque taglib, écrite en C, afin d'accéder aux tags de fichiers audio. Dans ce billet, nous verrons comment obtenir les valeurs des tags et comment modifier un tag.
Vous devez être identifié pour poster un commentaire.
Cet article fait suite au premier. Il s'intéresse à la classe principale qui permettra de manipuler les tags de fichiers audio.
Vous devez être identifié pour poster un commentaire.
J'utilise régulièrement ruby-taglib. Malheureusement, certains bugs empêchent son utilisation avec ruby 1.9. Après avoir tenté, avec plus ou moins de succès, de corriger ces bugs, j'ai décidé de réécrire cette bibliothèque. La version originale est basée sur ruby/DL, bibliothèque que je n'ai jamais utilisée. Je profite de cette réécriture pour proposer une série d'articles sur la manière d'adapter une bibliothèque C.
Vous devez être identifié pour poster un commentaire.
Le présent article explique comment afficher une icône dans la zone de notification à l'aide de la bibliothèque ruby/Gtk2.
Vous devez être identifié pour poster un commentaire.
| Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Copyright © 2000-2012 - www.developpez.com