wiki:ToolkitAudio/API

Terminologie :

  • j'utilise "segment" pour un terme générique englobant les "sections" et les "fragments", tels qu'on les a déjà défini. (note c'est en contradiction avec la dtd pour l'assemblage qui utilise aussi segment, mais on verra bien quand on en sera là !)
  • quand je parle "d'éditeur temporel", il s'agit de l'éditeur que tu fais, par opposition à l'éditeur structurel qui est la couche XED.

Unité : dans le fichier XML stocké, je pense que le mieux est que je stocke un nb entier de milli-secondes. Je ne vois pas l'intérêt de stocker une forme string lisible plus lourde à parser et stocker un nb de frames me semble trop dépendant du flux binaire. Imaginons que pour des raisons techniques, la fréquence des flux audio soit changée, toutes les reférences Xml seraient alors erronées. Donc:

  • la forme String lisible est réservée à l'affichage écran.
  • les millisecondes sont le format d'échange applicatif et le format de persistance (sérialisé en nombre décimal).
  • les frames sont utilisées par toi en interne.

Voilà les API (il ne s'agit pas d'IDL, mais simplement de méthodes XBL/javascript) :

Interface IAudioSegmentEditor : correspond au xbl "xul:audio" racine de l'outil :

  • init(pSrcAudio) > pSegmentsUpdated[] : init l'éditeur temporel. pSrcAudio est l'objet Xpcom. Attention, un nouvel init peut intervenir à tout moment (chgt de Src) donc besoin de tout purger/réinitialiser derrière, wave, etc. Les area / sections / fragments ont déjà été posés avec leurs attributs (start, etc.). Si certains segments /fragments s'avèrent en dehors des limites, de la source audio, les bornes sont modifées et les segments modifiés sont retournés dans un tableau. Attention pSrcAudio peut être null pour signifier que la source a disparu : a creuser pour savoir dans quel mode l'editeur se place alors (freeze ?).
  • srcAudio : propriété RO : objet audio.
  • titleAudio : propriété RW : titre de l'audio.
  • statusEditor : propriété RO : combinaison de bits :
    • 1 : l'éditeur a été initialisé (la méthode init() a été appelé au moins une fois).
    • 2 : l'éditeur possède une source audio valide
    • 4 : on est en mode batch (après un appel beginBatch(), et avant la fin de refresh()).
  • setFocusOnSegment(pSegment) : force le focus sur l'objet de type ISegment (svg:section ou svg:fragment) passé en paramètre. si ce segment est en dehors de la zone de zoom, on déplace le zoom pour afficher ce segment. Au besoin, on réduit le coeff de zoom pour permettre de visualiser tout le segment.
  • focusedSegment > pSegment : retourne le ISegment qui a actuellement le focus ou null si aucun ne détient actuellement le focus.
  • beginBatch() : indique qu'une modification des données est en cours. Le statut de l'editeur doit être modifié en conséquence. Cette méthode doit impérativement d'un appel à refresh();
  • refresh() : Utilisé en particulier pour les undo/redo (gérés par la couche XED), après des modifications / insertion / suppression d'un ensemble de segments. Les modifications des propriétés des segments existants seront réalisés par les méthodes ISegment.resetXxx, les suppressions de segments et les insertions de nouveaux segments seront réalisés via les méthodes du DOM insertChildBefore(), appendChild(), et removeChild(). La méthode beginBatch() sera obligatoirement appelée au préalable. Pendant cette phase, l'éditeur sera alors dans une situation instable jusqu'à l'appel à cette méthode refresh().
  • ms2Str(pMs) > "HHH:M:S.ms" : fonction utilitaire de transformation d'un nb de milli-secondes en chaîne string.
  • ms2Str(pMs, roundLevel) > "HHH:M:S.ms" : fonction utilitaire de transformation d'un nb de milli-secondes en chaîne string. RoundLevel précise le nombre de points après la virgule. Si null, pas d'arrondi.
  • zoomToSegment(aSegment);

Interface ISegment extends DomElement : correspond au dénominateur commun des xbl "svg:section" et "svg:fragment" :

  • startMs : propriété RO : début du segment par rapport au t0 de la source audio associée. En ms.
  • endMs : propriété RO : fin du segment par rapport au t0 de la source audio associée. En ms.
  • segmentOwner : propriété RW : objet ISegmentOwner détenteur de ce segment. C'est la couche XED qui l'affecte, si il est renseigné tu préviens le owner des chgts (voir ISegmentOwner ).
  • resetStart(pNewStartMs) : réaffectation d'un nouveau start (modif de l'attribut) et reset de tout état calculé. Aucun contrôle ni calcul interne n'est effectué. IAudioSegmentEditor.refresh() devra impérativement être appelé ultérieurement pour réinitialiser correctement ce segment et tous les autres modifiés ou ajoutés (Utilisé dans le cas de undo / redo).

Interface ISection extends ISegment : correspond au xbl "svg:section" :

  • insertChildSection(pNewSection, pBeforeSection, pSegmentOwner) > pOthersSegmentsUpdated[] : appelé par la couche XED pour insérer une nouvelle section. Aucun attribut start n'est spécifié dans pNewSection ; c'est l'éditeur temporel qui définit ce start en fonction du contexte : au milieu des 2 bornes alentours, d'après un "cursor helper" ou la position d'écoute, en recherchant le plus gros silence dans la zone (ce serait sympa ca !)... Synopsis de la méthode :
    • insertion dans l'arbre DOM et initialisation de la section (constructor XBL).
    • pNewSection.segmentOwner = pSegmentOwner;
    • calcul du start en fonction du contexte.
    • affectation dans l'attribut "start" de l'élément et variables internes.
    • récupération sur les autres sections et mémorisation de toutes les sections impactées.
    • retourne le tableau des autres segments impactés.
  • removeSection() > pOthersSegmentsUpdated[] : appelé par la couche XED pour supprimer une section. Si cette section contient des sous-sections elles sont supprimées en même temps. Retourne un tableau des autres sections (en dehors de celles supprimées) dont les bornes ont été impactées par cette suppression.

Interface IFragment extends ISegment : correspond au xbl "svg:fragment" (Version 2....) :

  • volume : propriété RW
  • fadeIn : propriété RW
  • fadeOut : propriété RW
  • overlapIn : propriété RO
  • overlapOut : propriété RO
  • resetEnd(pNewEndMs)
  • resetOverlapIn(pNewOverlapInMs)
  • resetOverlapOut(pNewOverlapOutMs)
  • srcAudio : : propriété RO (pour IAudioAssemblyEditor)
  • ...

Interface ISegmentOwnner : définit les méthodes que les objets XED détenteurs des segments doivent implémenter, les méthodes sont préfixées de "seg" pour éviter tout conflit.

  • segGainFocus(pSegment) : informe que ce segment a obtenu le focus dans l'éditeur temporel.
  • segLooseFocus(pSegment) : informe que ce segment a perdu le focus dans l'éditeur temporel.
  • segUpdateBounds(pSegment, pOthersSegmentsUpdated[]) : informe qu'un chgt de bornes est survenu sur pSegment. pOthersSegmentsUpdated est un tableau de ISegment dont les bornes ont été modifiées en conséquence (y compris les sections ancêtres si leur start ou end a été impacté). Les owners de ces autres segments ne sont pas directement informés de cet évènement. XED se charge de le propager convenablement.
  • segAskForCut(pSegment) : prévient le owner d'une demande de "coupe" du segment passé en paramètre. La couche Xed pourra alors appeler pSegment.parentNode.insertChildSection(vNewSection, pSegment.nextSibling); ou en fonction du contexte (pas de frère possible) pSegment.insertChildSection(vNewSection, null); . L'éditeur temporel devra avoir préserver le TimeStamp de start pour cette demande de création.

Autres méthodes pour mémoire en prévision de la v2, lorsqu'on attaquera les assemblages notamment.

  • segAskForDelete(pSegment)
  • segUpdateVolume(pSegment, pVolume)
  • segUpdateFade(pSegment, pFadeIn, pFadeOut)
  • ...