protocol audioAdaptation initstate 3 is fun forward (pi : (ip * udp * int * char^4 * int * blob) * int, i : interface) : (ip * udp * int * char^4 * int * blob) * int = if (i = thisInterface()) then pi else ( if (udpDst(#2 (#1 pi)) = 5002) then ( if (charPos(#4 (#1 pi)) >= 3) and (charPos(#4 (#1 pi)) <= 5) then ( let val load : int = InterfaceLoad(i) in (let val newdata : int * blob = changeData(load - getLoad(#2 pi), #9 (#1 pi)) in (OnNeighbor(network, i, (#1 (#1 pi), #2 (#1 pi), #3 (#1 pi), charVal(#1 newdata), #5 (#1 pi), #6 (#1 pi), #7 (#1 pi), #8 (#1 pi), #2 newdata)); (#1 pi, #1 newdata) ) end ) end ) else ( OnNeighbor(network, i, #1 pi); pi ) ) else ( OnNeighbor(network, i, #1 pi); pi ) ) fun getLoad(n : int) : int = if (n = 3) then 180 else if (n = 4) then 90 else 50 fun changeData(l : int, b : blob) : int * blob = if (l >= 1050) then (5, ScaleData(Resample16(b, 2), 2, 1)) else if (l >= 950) and (l < 1050) then (4, Resample16(b, 2)) else (3, b) fun dumbRepeat(p : ip * udp * int * char^4 * int * blob, n : int) : (ip * udp * int * char^4 * int * blob) * int = foldl(forward, (p, n), getInterfaces()) stream network(ps : int, ss : unit, p : ip * udp * int * char^4 * int * blob) is let val dst : host = ipDst(#1 p) in if isMulticast(dst) then (let val r : (ip * udp * int * char^4 * int * blob) * int = dumbRepeat(p, ps) in (#2 r, ss) end ) else (OnRemote(network, p); (ps, ss)) end