DIRECTORY BluejayUtils, BluejayUtilsRpcControl, Commander USING [CommandProc, Register], IO USING [card, int, rope, PutF, PutRope, real, STREAM], Rope USING [ROPE, Cat], VoiceRope, VoiceRopeServer, VoiceRopeDB USING [Handle, --Header, Interest, InterestInfo,-- VoiceRopeInfo, Error, Open, EnumerateVoiceRopes, EnumProc, --EnumerateInterestClass, InterestProc, UnpackHeader, UnpackInterest,-- NextTuneOnList, TuneID, TuneList]; VoiceRopeUsage: CEDAR PROGRAM IMPORTS BluejayUtils, BluejayUtilsRpcControl, Commander, IO, Rope, VoiceRope, VoiceRopeDB ~ BEGIN ROPE: TYPE ~ Rope.ROPE; vrdb: ROPE _ "/Strowger.lark//Strowger/VoiceRopesLB"; feedback: IO.STREAM; -- for feedback during statistics gathering vrTotalSpace: CARD _ 0; vfileTotalSpace: CARD _ 0; maxVFID: CARD = 1000; vrsByFile: ARRAY [0..maxVFID] OF CARDINAL _ ALL[0]; maxVrsPerTune: CARD = 25; tunesByVrs: ARRAY [0..maxVrsPerTune] OF CARDINAL _ ALL[0]; maxVRSegs: CARD = 25; vrsByNumSegs: ARRAY [0..maxVRSegs] OF CARD _ ALL[0]; maxVRSize: CARD = 960000; -- two minutes of voice (8000*120) vrBucketSize: CARD = 8000; -- one second buckets vrsBySize: ARRAY [0..maxVRSize/vrBucketSize] OF CARD _ ALL[0]; vrsWithNegLength: CARD _ 0; vrNum: CARD _ 0; vrTotalLength: REAL _ 0; -- in samples maxSegSize: CARD = 480000; -- one minute of voice (8000*60) bucketSize: CARD = 8000; -- one second buckets segsBySize: ARRAY [0..maxSegSize/bucketSize] OF CARD _ ALL[0]; segsWithNegLength: CARD _ 0; segsThatStartOnZero: CARD _ 0; segsNum: CARD _ 0; segsTotalLength: REAL _ 0; -- in samples vr: VoiceRope.VoiceRope _ NEW[VoiceRope.VoiceRopeInterval]; PrintStats: PUBLIC PROC [out: IO.STREAM] RETURNS [] ~ { numVrs, numTunes, numSegs: CARD _ 0; IO.PutRope[out, "\n\n"]; IO.PutRope[out, "Voice ropes by number of tune segments:\n"]; FOR i: CARD IN [0..maxVRSegs] DO IO.PutF[out, " %g: %g\n", IO.card[i], IO.card[vrsByNumSegs[i]]]; numVrs _ numVrs + vrsByNumSegs[i]; ENDLOOP; IO.PutF[out, "%g total voice ropes\n", IO.card[numVrs]]; IO.PutRope[out, "\n"]; IO.PutF[out, "Voice rope sizes (%g samples):\n", IO.card[vrBucketSize]]; FOR i: CARD IN [0..maxVRSize/vrBucketSize] DO IO.PutF[out, " <%g: %g\n", IO.card[i], IO.card[vrsBySize[i]]]; ENDLOOP; IO.PutF[out, "Total # of voice ropes = %g\n", IO.card[vrNum]]; IO.PutF[out, "Total voice rope storage = %g\n", IO.real[vrTotalLength]]; IO.PutF[out, "Average voice rope length (in seconds) = %g\n", IO.real[(vrTotalLength/vrNum)/8000]]; IO.PutF[out, "%g voice ropes have negative length\n", IO.card[vrsWithNegLength]]; IO.PutRope[out, "\n"]; IO.PutF[out, "Segment sizes (%g samples):\n", IO.card[bucketSize]]; FOR i: CARD IN [0..maxSegSize/bucketSize] DO IO.PutF[out, " <%g: %g\n", IO.card[i], IO.card[segsBySize[i]]]; numSegs _ numSegs + segsBySize[i]; ENDLOOP; IO.PutF[out, "Total # of segments = %g\n", IO.card[segsNum]]; IO.PutF[out, "Total segment storage = %g\n", IO.real[segsTotalLength]]; IO.PutF[out, "Average segment length (in seconds) = %g\n", IO.real[(segsTotalLength/segsNum)/8000]]; IO.PutF[out, "%g total segments\n", IO.card[numSegs]]; IO.PutF[out, "%g segments have negative length\n", IO.card[segsWithNegLength]]; IO.PutF[out, "%g segments start at zero\n", IO.card[segsThatStartOnZero]]; IO.PutRope[out, "\n"]; IO.PutRope[out, "Tunes by number of voice ropes:\n"]; FOR i: CARD IN [1..maxVFID] DO vrs: CARD = vrsByFile[i]; SELECT vrs FROM IN [1..maxVrsPerTune] => tunesByVrs[vrs] _ tunesByVrs[vrs] + 1; > maxVrsPerTune => tunesByVrs[0] _ tunesByVrs[0] + 1; ENDCASE => NULL; ENDLOOP; FOR i: CARD IN [0..maxVrsPerTune] DO IO.PutF[out, " %g: %g\n", IO.card[i], IO.card[tunesByVrs[i]]]; numTunes _ numTunes + tunesByVrs[i]; ENDLOOP; IO.PutF[out, "%g total tunes\n", IO.card[numTunes]]; IO.PutRope[out, "\n"]; }; CollectStats: VoiceRopeDB.EnumProc ~ { numSegs: CARD _ 0; tid: VoiceRopeDB.TuneID; tstart, tlen: INT; tl: VoiceRopeDB.TuneList _ info.struct; vrNum _ vrNum + 1; WHILE tl#NIL DO [tune: tid, start: tstart, length: tlen, rest: tl] _ VoiceRopeDB.NextTuneOnList[tl]; IF tid IN INT[1..maxVFID] THEN vrsByFile[tid] _ vrsByFile[tid] + 1 ELSE vrsByFile[0] _ vrsByFile[0] + 1; numSegs _ numSegs + 1; IF NOT (tl=NIL AND numSegs=1) THEN { -- only gather for multi-segment vrs IF tlen>=0 THEN { segsTotalLength _ segsTotalLength + tlen; tlen _ tlen/bucketSize + 1; }; SELECT tlen FROM <0 => { segsWithNegLength _ segsWithNegLength + 1; IO.PutF[feedback, "\nWarning: vr=%g segment length=%g\n", IO.rope[info.vrID], IO.int[tlen]]; }; IN [1..maxSegSize/bucketSize] => segsBySize[tlen] _ segsBySize[tlen] + 1; ENDCASE => segsBySize[0] _ segsBySize[0] + 1; IF tstart = 0 THEN segsThatStartOnZero _ segsThatStartOnZero + 1; }; segsNum _ segsNum + 1; -- total number of segments ENDLOOP; IF info.length < 0 THEN { vr.ropeID _ info.vrID; info.length _ VoiceRope.Length[vr: vr]; }; IF info.length>=0 THEN { vrTotalLength _ vrTotalLength + info.length; info.length _ info.length/vrBucketSize + 1; }; SELECT info.length FROM <0 => { vrsWithNegLength _ vrsWithNegLength + 1; IO.PutF[feedback, "\nWarning: vr=%g length=%g\n", IO.rope[info.vrID], IO.int[info.length]]; }; IN [1..maxVRSize/vrBucketSize] => vrsBySize[info.length] _ vrsBySize[info.length] + 1; ENDCASE => { vrsBySize[0] _ vrsBySize[0] + 1; IO.PutF[feedback, "\nWarning: vr=%g length (in buckets)=%g\n", IO.rope[info.vrID], IO.int[info.length]]; }; IF numSegs IN [0..maxVRSegs] THEN vrsByNumSegs[numSegs] _ vrsByNumSegs[numSegs] + 1 ELSE vrsByNumSegs[0] _ vrsByNumSegs[0] + 1; IO.PutRope[feedback, " ."]; }; Analyze: Commander.CommandProc = { ENABLE VoiceRopeDB.Error => {msg _ Rope.Cat["ERROR: ", explanation]; GOTO Error}; handle: VoiceRopeDB.Handle _ VoiceRopeDB.Open[dbName: vrdb]; IO.PutF[cmd.out, "Analyzing %g ...\n", IO.rope[vrdb]]; feedback _ cmd.out; VoiceRopeDB.EnumerateVoiceRopes[handle: handle, start: NIL, proc: CollectStats]; PrintStats[cmd.out]; EXITS Error => RETURN; }; AnalyzeTunes: Commander.CommandProc = { exists: BOOL; size: INT; num: CARD _ 0; feedback _ cmd.out; BluejayUtilsRpcControl.ImportInterface[interfaceName: [type: "BluejayUtils", instance: "Strowger.lark"]]; FOR tid: CARD IN [0..maxVFID] DO [exists, size] _ BluejayUtils.DescribeTune[tid]; IF exists THEN { vfileTotalSpace _ vfileTotalSpace + size; num _ num + 1; }; ENDLOOP; IO.PutF[cmd.out, "Total # of tunes = %g\n", IO.card[num]]; IO.PutF[cmd.out, "Total length of tunes (in chirps) = %g\n", IO.card[vfileTotalSpace]]; }; Commander.Register[key: "VRUsage", proc: Analyze, doc: "Gathers statistics about voice ropes by analyzing the database"]; Commander.Register[key: "TuneStorage", proc: AnalyzeTunes, doc: "Computes total tune storage."]; END. 8VoiceRopeUsage.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. Doug Terry, August 3, 1987 1:29:20 pm PDT Gathers statistics about voice ropes by analyzing the database. vrdb: ROPE _ "/Morley.lark//DCS/VoiceRopeServer/VoiceRopesLB"; Usage statistics: Storage Number of voice ropes that use a given voice file Number of segments in a voice rope Lengths of voice ropes Average length Segment sizes for voice ropes Average length An actual voice rope Prints the gathered stats. [info: VoiceRopeInfo] RETURNS [continue: BOOLEAN _ TRUE] [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] Enumerates the voice rope database and gathers statistics. [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL] Enumerates the the jukebox and computes total tune length. Κ;˜codešœ™Kšœ<™Kšœœ+˜5K˜Kšœ œœΟc+˜AK˜KšΟzœ™K™K™Kšœœ˜Kšœœ˜K˜K™1Kšœ œ˜Kš œ œœœœ˜3Kšœœ˜Kš œ œœœœ˜:K˜K™"Kšœ œ˜Kš œœœœœ˜4K˜K™Kšœ œ Ÿ"˜=Kšœœ Ÿ˜1Kš œ œœœœ˜>Kšœœ˜K™Kšœœ˜KšœœŸ ˜'K˜K™Kšœ œ Ÿ ˜Kšœœ˜Kšœœ˜K™Kšœ œ˜KšœœŸ ˜)K˜K™Kšœœ˜;K˜š Οn œœœœœœ˜7K™Kšœœ˜$Kšœ˜Kšœ;˜=šœœœ˜ Kšœœ œ˜AKšœ"˜"Kšœ˜—Kšœ6˜8Kšœ˜KšœF˜Hšœœœ˜-Kšœœ œ˜?Kšœ˜—Kšœ<˜>KšœF˜HKšœa˜cKšœO˜QKšœ˜KšœA˜Cšœœœ˜,Kšœœ œ˜@Kšœ"˜"Kšœ˜—Kšœ;˜=KšœE˜GKšœb˜dKšœ4˜6KšœM˜OKšœH˜JKšœ˜Kšœ3˜5šœœœ˜Kšœœ˜šœ˜Kšœ=˜?Kšœ5˜5Kšœœ˜—Kšœ˜—šœœœ˜$Kšœœ œ˜?Kšœ$˜$Kšœ˜—Kšœ2˜4Kšœ˜K˜K™—•StartOfExpansionL -- [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: ROPE _ NIL]š‘ œ˜&Kšœœ œœ™8Kšœ œ˜Kšœ˜Kšœœ˜Kšœ'˜'Kšœ˜šœœ˜KšœT˜Tšœœœ ˜Kšœ$˜(Kšœ!˜%—K˜š œœœœ œŸ$˜Jšœ œ˜Kšœ)˜)Kšœ˜K˜—šœ˜šœ˜Kšœ*˜*Kšœ8œœ ˜\K˜—KšœG˜IKšœ&˜-—Kšœ œ/˜AK˜—KšœŸ˜3Kšœ˜—šœœ˜K˜Kšœ'˜'K˜—šœœ˜Kšœ,˜,Kšœ+˜+Kšœ˜—šœ ˜šœ˜Kšœ(˜(Kšœ0œœ˜[K˜—KšœT˜Všœ˜ Kšœ ˜ Kšœ=œœ˜hK˜——šœ œ˜Kšœ2˜6Kšœ'˜+—Kšœ˜Kšœ˜K˜—š‘œ˜"Kš œœ œœœœœ™HK™:K–/[conv: LoganBerry.Conv _ NIL, dbName: ROPE]šœ?œ˜QKšœ<˜