• Aucun résultat trouvé

De la webradio lambda à la λ-webdradio

N/A
N/A
Protected

Academic year: 2022

Partager "De la webradio lambda à la λ-webdradio"

Copied!
52
0
0

Texte intégral

(1)

De la webradio lambda ` a la λ-webdradio

Samuel Mimram

et David Baelde, Romain Beauxis, . . .

Groupe de Travail Programmation

20 novembre 2008

1 / 35

(2)

De la radio ` a la webradio

La plupart des radios hertziennes diffusent aussi leur contenu sur internet.

De plus en plus de webradiosnaissent, ne diffusant que par internet.

(3)

De la radio ` a la webradio

La plupart des radios hertziennes diffusent aussi leur contenu sur internet.

De plus en plus de webradiosnaissent, ne diffusant que par internet.

2 / 35

(4)

Une webradio, c’est simple

auditeur webradio flux //serveur

55l

ll ll ll ll ll ll

lRRRRRRRRRRRR//R))

R auditeur

auditeur

(Liquidsoap) (Icecast)

(5)

Ce que l’on veut

Divers formats et moyens de stockage des fichiers (en particulier ´emission d’un flux dans plusieurs formats)

Gestion des listes de lecture

(crit`eres, horaire, d´ecrochage, jingles, . . . )

Traitement du son

(normalisation, enchaˆınement, d´etection de blanc, . . . )

4 / 35

(6)

Outils pr´ eexistants

Outils l´egers

(Ices, EZStream, Darkice)

en console

flux `a partir d’une playlist ou d’une carte son

Outils plus complets

(Rivendell, Master Control, WinRadio, Open Radio)

interface graphique

en´eration de playlists

transitions

quelques traitements audio

λ-outils (Liquidsoap)

scriptable

extensible

(7)

Outils pr´ eexistants

Outils l´egers

(Ices, EZStream, Darkice)

en console

flux `a partir d’une playlist ou d’une carte son

Outils plus complets

(Rivendell, Master Control, WinRadio, Open Radio)

interface graphique

en´eration de playlists

transitions

quelques traitements audio

λ-outils (Liquidsoap)

scriptable

extensible

5 / 35

(8)

Outils pr´ eexistants

Outils l´egers

(Ices, EZStream, Darkice)

en console

flux `a partir d’une playlist ou d’une carte son

Outils plus complets

(Rivendell, Master Control, WinRadio, Open Radio)

interface graphique

en´eration de playlists

transitions

quelques traitements audio

λ-outils (Liquidsoap)

scriptable

extensible

(9)

Qui utilise Liquidsoap ?

Des webradios (Dolebra¨ı, . . . )

Des hˆopitaux et des supermarch´es

Des g´en´erateurs de webradios (radionomy)

D’autres gens (transcodage, number radios, morse, . . . )

6 / 35

(10)

Plan

1 Conception : on veut un langage

pour manipuler des flux

le plus g´en´erique possible

le plus sˆur possible

abordable pour desnon-informaticiens

2 Impl´ementation : il faut que ¸ca soit

rapide (≤temps r´eel)

modulaire

(11)

Plan

1 Conception : on veut un langage

pour manipuler des flux

le plus g´en´erique possible

le plus sˆur possible

abordable pour desnon-informaticiens

2 Impl´ementation : il faut que ¸ca soit

rapide (≤temps r´eel)

modulaire

7 / 35

(12)

Premi` ere partie I

Conception

(13)

Un programme typique

1 D´ecodage `a partir d’une ou plusieurs sources

2 Traitement du son

3 Encodage et ´emission

9 / 35

(14)

Gestion de flux

Une instance de Liquidsoap produit un ou plusieursflux`a partir d’un graphe d’op´erateurs d´ecrit par un script.

(15)

Gestion de flux

Une instance de Liquidsoap produit un ou plusieursflux`a partir d’un graphe d’op´erateurs d´ecrit par un script.

Enchaˆınement lin´eaire d’op´erateurs

playlist //normalize //output.icecast.vorbis

# !/usr/bin/liquidsoap

s = playlist("/home/smimram/liste_des_chansons") s = normalize(s)

s = output.icecast.vorbis(host="localhost",s)

10 / 35

(16)

Gestion de flux

Une instance de Liquidsoap produit un ou plusieursflux`a partir d’un graphe d’op´erateurs d´ecrit par un script.

Enchaˆınement lin´eaire d’op´erateurs

playlist //normalize //output.icecast.vorbis

# !/usr/bin/liquidsoap

s = playlist("/home/smimram/liste_des_chansons") s = normalize(s)

s = output.icecast.vorbis(host="localhost",s)

(17)

Gestion de flux

Une instance de Liquidsoap produit un ou plusieursflux`a partir d’un graphe d’op´erateurs d´ecrit par un script.

Un exemple plus complexe

request.queue //mix //output.icecast

playlist

77p

pp pp pp pp pp

//output.icecast

10 / 35

(18)

Le mod` ele de flux

Les flux sont :

des suites dedonn´ees(´echantillons, . . . )

regroup´es enpistes

avec des m´etadonn´ees

qui peuvent ˆetre temporairementindisponibles.

(19)

Le mod` ele de flux

Exemple : unjingle tous les deux morceaux

playlist(”normal.pls”) //random(weights= [1,2]) //

playlist(”jingles.pls”)

33h

hh hh hh hh hh hh hh hh hh

Exemple : requˆetes d’auditeurs

request.queue //fallback //

playlist

66m

mm mm mm mm mm mm

12 / 35

(20)

Le mod` ele de flux

Exemple : unjingle tous les deux morceaux

playlist(”normal.pls”) //random(weights= [1,2]) //

playlist(”jingles.pls”)

33h

hh hh hh hh hh hh hh hh hh

Exemple : requˆetes d’auditeurs

request.queue //fallback //

playlist

66m

mm mm mm mm mm mm

(21)

Les transitions

Pour une ´ecoute agr´eable, il faut destransitions

entre deux pistes cons´ecutives d’une mˆeme source,

ou quand on passe d’une source `a l’autre (e.g. fallback).

Diff´erents types de transitions.

Aucune : les pistes sont juxtapos´ees,

Fondu : dur´ee du fondu, en entr´ee ou en sortie.

Fondu crois´e (crossfade) :

Dur´ees des fondus, dur´ee du recouvrement.

Ajuster les volumes ?

Ins´erer un jingle ?

etc.

Solution g´en´erique :

transition =source×source→source.

13 / 35

(22)

Les transitions

Pour une ´ecoute agr´eable, il faut destransitions

entre deux pistes cons´ecutives d’une mˆeme source,

ou quand on passe d’une source `a l’autre (e.g. fallback).

Diff´erents types de transitions.

Aucune : les pistes sont juxtapos´ees,

Fondu : dur´ee du fondu, en entr´ee ou en sortie.

Fondu crois´e (crossfade) :

Dur´ees des fondus, dur´ee du recouvrement.

Ajuster les volumes ?

Ins´erer un jingle ?

etc.

Solution g´en´erique :

transition =source×source→source.

(23)

Les transitions

Pour une ´ecoute agr´eable, il faut destransitions

entre deux pistes cons´ecutives d’une mˆeme source,

ou quand on passe d’une source `a l’autre (e.g. fallback).

Diff´erents types de transitions.

Aucune : les pistes sont juxtapos´ees,

Fondu : dur´ee du fondu, en entr´ee ou en sortie.

Fondu crois´e (crossfade) :

Dur´ees des fondus, dur´ee du recouvrement.

Ajuster les volumes ?

Ins´erer un jingle ?

etc.

Solution g´en´erique :

transition =source×source→source.

13 / 35

(24)

Exemple typique de transition

R´ealisons un fondu crois´e sur la sources:

1 s = fade.out(duration=3., s)

100

0 volume (%)

temps (s) pisten pisten+ 1

2 s = fade.in(duration=2., s)

100

0 volume (%)

temps (s) pisten pisten+ 1

3 cross(duration=2., (fun (a,b) -> add([a,b])), s)

100 volume (%)

pisten pisten+ 1

(25)

Le langage de script

Un langage fonctionnel (pour les transitions).

Des arguments ´etiquet´es et optionnels (pour le confort).

Besoin d’analyse statique, int´egration de la documentation, simplicit´e d’utilisation.

⇒Cr´eation d’un nouveau langage typ´e et d’un interpr´eteur.

$ liquidsoap -h cross

Generic cross operator, allowing the composition of the [duration] last seconds of a track with the beginning of the next track.

Type:

(?duration:float, ((src, src)->src), src)->src Parameters:

* duration :: float (default 5.)

* (unlabeled) :: (src, src)->src Transition function.

* (unlabeled) :: src

15 / 35

(26)

% liquidsoap -h output.icecast.vorbis

Output the source stream as an Ogg Vorbis stream to an Icecast-compatible server in Variable BitRate mode.

Type:

(?id:string, ?samplerate:int, ?stereo:bool, ?skeleton:bool,

?start:bool, ?restart:bool, ?restart_delay:int, ?host:string,

?port:int, ?user:string, ?password:string, ?genre:string,

?url:string, ?description:string, ?public:bool,

?multicast_ip:string, ?sync:bool, ?dumpfile:string,

?mount:string, ?name:string, source, ?quality:float)->source Parameters:

* id :: string (default "") Force the value of the source ID.

* samplerate :: int (default 44100)

* stereo :: bool (default true)

* skeleton :: bool (default false) Add an ogg skeleton to the stream. Recommended for theora only.

* start :: bool (default true) Start output threads on operator initialization.

* restart :: bool (default false) Restart output after a failure. By default, liquidsoap will stop if the output failed.

* restart_delay :: int (default 3) Delay, in seconds, before attempting new connection, if restart is enabled.

* host :: string (default "localhost")

* port :: int (default 8000)

* user :: string (default "source") User for shout source connection. Useful only in special cases, like with per-mountpoint users.

* password :: string (default "hackme") ...

* genre :: string (default "Misc")

* url :: string (default "http://savonet.sf.net")

* description :: string (default "OCaml Radio!")

* public :: bool (default true)

* multicast_ip :: string (default "no_multicast")

* sync :: bool (default false)

Let shout do the synchronization.

* dumpfile :: string (default "")

Dump stream to file, for debugging purpose. Disabled if empty.

* mount :: string (default "Use [name].ogg")

* name :: string (default "Use [mount]")

* (unlabeled) :: source (default None)

16 / 35

(27)

Comment g´erer les ´etiquettes ?

17 / 35

(28)

Les ´ etiquettes d’OCaml

Les ´etiquettes d’OCaml sont con¸cues pour ˆetre ´elimin´ees `a la compilation, ce qui entraˆıne quelques limitations :

# let app f = f ~a:1 ~b:2 ;;

val app : (a:int -> b:int -> ’a) -> ’a = <fun>

# app (fun ~b ~a -> a+b) ;;

This function should have type a:int -> b:int -> ’a.

On a besoin d’une multi-application, mais celle-ci ne peut ˆetre 0-aire en OCaml (d’o`u les arguments ineffa¸cables).

# let f ?(a=false) () = a ;;

val f : ?a:bool -> unit -> bool = <fun>

# f () ~a:true ;; - : bool = true

# (f ()) ~a:true ;;

This expression is not a function, it cannot be applied.

(29)

Les ´ etiquettes d’OCaml

Les ´etiquettes d’OCaml sont con¸cues pour ˆetre ´elimin´ees `a la compilation, ce qui entraˆıne quelques limitations :

# let app f = f ~a:1 ~b:2 ;;

val app : (a:int -> b:int -> ’a) -> ’a = <fun>

# app (fun ~b ~a -> a+b) ;;

This function should have type a:int -> b:int -> ’a.

On a besoin d’une multi-application, mais celle-ci ne peut ˆetre 0-aire en OCaml (d’o`u les arguments ineffa¸cables).

# let f ?(a=false) () = a ;;

val f : ?a:bool -> unit -> bool = <fun>

# f () ~a:true ;;

- : bool = true

# (f ()) ~a:true ;;

This expression is not a function, it cannot be applied.

18 / 35

(30)

Dans notre cas, la simplicit´e passe avant l’efficacit´e.

On a besoin de formaliser un λ-calcul avec

´etiquettes,

arguments optionnels,

multi-abstraction et multi-application.

(31)

Termes

Les termes sont g´en´er´es par les constructions suivantes :

M ::= v

| x

| let x =M in M

| λ{. . . ,li :xi, . . . ,lj :xj =M, . . .}.M

| M{l1=M, . . . ,ln=M}

Modulo permutation d’´etiquettes distinctes :

λ{Γ,l:x,l0:x0,∆}.M λ{Γ,l0 :x0,l:x,∆}.M λ{Γ,l:x =N,l0:x0,∆}.M λ{Γ,l0 :x0,l:x =N,∆}.M λ{Γ,l:x =N,l0:x0=N0,∆}.M λ{Γ,l0 :x0=N0,l:x =N,∆}.M (sil 6=l0).

20 / 35

(32)

R´ eduction

On a trois r`egles de r´eduction :

let x =M in N N[M/x]

L’application peut ˆetre partielle, si Γ est ineffa¸cable: (λ{−−−−−−−−−−−−→

li :xi,lj :xj =Mj,Γ}.M){−−−−→

li =Ni} λ{Γ}.(M[−−−→

Ni/xi]) outotalesinon :

(λ{−−−−−−−−−−−→

li :xi,lj :xj =Pj,−−−−−−−−→

lk0 :yk =Mk}.M){−−−−→

li =Ni} M[−−−→

Ni/xi,−−−−→

Mk/yk] Exemple

F :=λ{l1:x,l2:y =12,l3 :z =13}.M

F{l3=3} λ{l1 :x,l2 :y =12}.M[3/z]

F{l =3}{l =1} M[1/x,12/y,3/z]

(33)

Typage

Les types et sch´emas de types sont sans surprise :

t ::= ι | α | {. . . ,li :ti, . . . ,?lj :tj, . . .} →t σ ::= t | ∀α. σ

On consid`ere naturellement des r`egles comme Γ`M:{. . . ,li :ti. . . ,?lj :tj, . . .} →t

Γ`N1:t1 · · · Γ`Nn:tn

Γ`M{. . . ,li =Ni, . . . ,lj =Nj, . . .}:t(App) ou encore

Γ, . . . ,xi :ti, . . . ,xj :tj, . . .`M:t · · · Γ`Mj :tj · · ·

Γ`λ{. . . ,li :xi, . . . ,lj :xj =Mj, . . .}.M :{. . . ,li :ti, . . . ,?lj :tj, . . .} →t(Abs)

22 / 35

(34)

Sous-typage et application partielle

La r´eduction permet l’application partielle. Le syst`eme de type, pas encore : une fonction de type{l1:t1,l2:t2} →t doit pouvoir ˆetre consid´er´ee comme une fonction de type{l1 :t1} → {l2:t2} →t.

∆ ineffa¸cable

{Γ,∆} →t≤{Γ} → {∆} →t

∆ effa¸cable {Γ,∆} →t≤{Γ} →t

Quelques ´equations invalides :

{l1 :t1} → {l2:t2} →t6≤{l1 :t1,l2 :t2} →t

{Γ,?l :t,∆} →t06≤{Γ,l :t,∆} →t0

(35)

Sous-typage et application partielle

La r´eduction permet l’application partielle. Le syst`eme de type, pas encore : une fonction de type{l1:t1,l2:t2} →t doit pouvoir ˆetre consid´er´ee comme une fonction de type{l1 :t1} → {l2:t2} →t.

∆ ineffa¸cable

{Γ,∆} →t≤{Γ} → {∆} →t

∆ effa¸cable {Γ,∆} →t≤{Γ} →t Quelques ´equations invalides :

{l1 :t1} → {l2:t2} →t6≤{l1 :t1,l2 :t2} →t

{Γ,?l :t,∆} →t06≤{Γ,l :t,∆} →t0

23 / 35

(36)

{Γ, ?l : t, ∆} → t

0

6≤{Γ, l : t, ∆} → t

0

Par exemple, consid´erons le termef suivant

λ{l :x = 5}.x : {?l :int} →int On ne peut pas calculer

f{}{l = 6}

donc on n’a pas

λ{l :x = 5}.x : {l :int} →int

(37)

Quelques propri´ et´ es du calcul

Le calcul pur est confluent.

Subject reduction.

Les termes typables sont terminants.

25 / 35

(38)

Inf´ erence

Une variante de l’algorithme W de Damas-Milner.

Il n’y a pas de type principal : λ{l :g}.g{l0 = 42} admet

∀α.{l :{l0 :int} →α} →α et

∀α.{l :{?l0 :int} →α} →α comme types.

Cependant, on peut plonger les termes f : {?l :int} →α dans

λ{l :x}.f{l =x} : {l :int} →α

(39)

Inf´ erence

Une variante de l’algorithme W de Damas-Milner.

Il n’y a pas de type principal : λ{l :g}.g{l0 = 42} admet

∀α.{l :{l0 :int} →α} →α et

∀α.{l :{?l0 :int} →α} →α comme types.

Cependant, on peut plonger les termes f : {?l :int} →α dans

λ{l :x}.f{l =x} : {l :int} →α

26 / 35

(40)

Inf´ erence

Une variante de l’algorithme W de Damas-Milner.

Il n’y a pas de type principal : λ{l :g}.g{l0 = 42} admet

∀α.{l :{l0 :int} →α} →α et

∀α.{l :{?l0 :int} →α} →α comme types.

Cependant, on peut plonger les termes f : {?l :int} →α dans

λ{l :x}.f{l =x} : {l :int} →α

(41)

Remarque : variante avec types principaux

D´ecomposer la multi-application en

une multi-application partielle (λ{−−−−−−−−−−−−→

li :xi,lj :xj =Mj,Γ}.M){−−−−→

li =Ni} λ{Γ}.(M[−−−→

Ni/xi])

une destruction des multi-abstractions effa¸cables (λ{−−−−−−−→

li :xi =Mi}.M)• M[−−−→

Mi/xi]

27 / 35

(42)

Deuxi` eme partie II

Impl´ ementation

(43)

Le code

Impl´ement´e en OCaml (et en C)

Savonet (OCaml : 60 kLOC, C : 15 kLOC) Liquidsoap (OCaml : 35 kLOC, C : 1.8 kLOC)

Plus de 30 librairies :

formats audio (mad+lame, ogg/vorbis, aac, speex, . . . + tags)

carte son (alsa, ao, pulseaudio, portaudio, . . . )

effets audio (ladspa, samplerate, . . . )

transmission audio (jack, shout)

autres (lastfm, irc)

29 / 35

(44)

Les flux

Pas d’acc`es direct depuis le langage.

D´ecoup´es enbuffers (perfs vs realtime)

de type float array

(endianness, pr´ecis, non box´e, tout en OCaml)

Il faut g´erer les buffers partiels

On partage et r´eutilise les buffers pour ´eviter les copies (mais probl`emes de temporalit´es)

(45)

Interaction avec l’ext´ erieur

Playlists dynamiques

Telnet (ou socket)

queues de requˆetes

variables

M´etadonn´ees (ex : replaygain, transitions) Tout est envisageable : sites web, bots IRC, etc.

31 / 35

(46)

Gestion des “fichiers”

Il faut en particulier

t´el´echarger les fichiers distants en avance,

g´erer les flux web,

protocoles extensibles avec plusieurs r´esolutions (say://,replaygain://,strider://, . . . )

(47)

Le pr´ esent

La version SVN de Liquidsoap a le support de lavid´eo.

Bon point : ¸ca rentre tr`es facilement dans notre cadre

De nouveaux probl`emes :

la synchronisation entre les pistes du flux

il fautvraimentˆetre efficace :

640×480×4×24 30 Mo/s (en particulier encodage et YUV→RGB)

cod´e en C,gccavec optimisations

33 / 35

(48)

Le futur

G´erer les flux h´et´erog`enes de fa¸con typ´ee :

des flux que audio ou que vid´eo (canaux, r´esolution, . . . )

des flux compress´es

etc.

G´erer finement les partages (avec des boˆıtes dans le typage ?)

(49)

Conclusion

Une variante originale du λ-calcul.

Beaucoup de composants r´eutilisables.

Un langage

purement fonctionnel

statiquement typ´e

programm´e en OCaml

qui commence `a ˆetre utilis´e (par des non-programmeurs).

D´emo par David. . .

35 / 35

(50)

Conclusion

Une variante originale du λ-calcul.

Beaucoup de composants r´eutilisables.

Un langage

purement fonctionnel

statiquement typ´e

programm´e en OCaml

qui commence `a ˆetre utilis´e (par des non-programmeurs).

D´emo par David. . .

(51)

Conclusion

Une variante originale du λ-calcul.

Beaucoup de composants r´eutilisables.

Un langage

purement fonctionnel

statiquement typ´e

programm´e en OCaml

qui commence `a ˆetre utilis´e (par des non-programmeurs).

D´emo par David. . .

35 / 35

(52)

Conclusion

Une variante originale du λ-calcul.

Beaucoup de composants r´eutilisables.

Un langage

purement fonctionnel

statiquement typ´e

programm´e en OCaml

qui commence `a ˆetre utilis´e (par des non-programmeurs).

D´emo par David. . .

Références

Documents relatifs

2° Un mât 1 de poids P = 5000 N est articulé en O par un axe 3 qui exerce une réaction R; il est maintenu en équilibre par le câble AB noté 2 qui exerce une tension T = 2500 N Faire

Exercice 4 : La combustion complète de 0.35 g d’un composé A de formule brute C x H y a donné 0,45 g d’eau. Déduire celui du carbone.. 2/ a- Sachant que la masse molaire de A est

 Le deuxième objectif de cette RDP est de déterminer la surface de panneaux photovoltaïques que doit comporter un satellite pour assurer son bon fonctionnement et la

Si l'on en croit Jesse Fox, auteur principal d'une étude et professeur assistante en communication à l'Université de l'Ohio, les hommes qui publient beaucoup de selfies sur

Les élèves ne disposant pour l’instant que d’informations qualitatives sur l’énergie potentielle et l’énergie cinétique d’un système, le but de

marge brute – remise – prix d’achat net – prix de vente hors taxe – coût d’achat prix de vente toute taxe comprise – prix d’achat net – frais d’achat – prix

En traction, torsion ou flexion il est possible de résoudre un système qui est hyperstatique et d’en déterminer sa déformation, ou la contrainte. Pour cela la même méthode pour

Sony a également annoncé qu'il se lancerait directement sur le marché du jeu sur portable. Sa PlayStation Suite 20 distribuera d'anciens jeux pour.. PlayStation 21 One 22 pour