DIRECTORY Process USING [ Detach, MsecToTicks, Pause ], Rope USING [ ROPE ], VoiceRope USING [ GetByInterest, Handle, Open, Play, VoiceRope ] ; PlayNoiseImpl: CEDAR PROGRAM IMPORTS Process, VoiceRope = { reallyBoot: BOOL¬TRUE; didOurBest: BOOL; maxTime: CARDINAL ¬ 4000; PlayAButton: PROC[name: Rope.ROPE] = TRUSTED { didOurBest ¬ FALSE; Process.Detach[FORK ReallyPlayAButton[name]]; FOR i: NAT IN [0..100) DO Process.Pause[Process.MsecToTicks[maxTime/100]]; IF didOurBest THEN EXIT; ENDLOOP; }; ReallyPlayAButton: PROC[name: Rope.ROPE] = { C: PROC[complaint: Rope.ROPE] = {NULL}; -- Don't bother complaining. handle: VoiceRope.Handle = VoiceRope.Open[Complain: C]; vr: VoiceRope.VoiceRope = VoiceRope.GetByInterest[handle: handle, class: "SysNoises", refID: name]; VoiceRope.Play[handle: handle, voiceRope: vr, wait: TRUE]; didOurBest ¬ TRUE; }; }. ό PlayNoiseImpl.mesa Copyright Σ 1987, 1992 by Xerox Corporation. All rights reserved. Last Edited by: Swinehart, June 4, 1992 10:23 pm PDT Doug Terry, July 30, 1986 5:00:49 pm PDT PlayTheRollbackButton: Booting.CheckpointProc = TRUSTED { IF ~UserProfile.Boolean["Finch.NoisyBoot"] THEN RETURN; PlayAButton["Rollback"]; IF ~reallyBoot THEN rejection ¬ "Just pretending"; }; Doug Terry, July 30, 1986 5:00:08 pm PDT Upgraded to use VoiceRope changes to: DIRECTORY, PlayNoiseImpl, ReallyPlayAButton Κα•NewlineDelimiter –(cedarcode) style™™Icodešœ Οeœ7™BJ™4K™(J™—šΟk ˜ Kšœžœ ˜-Kšœžœžœ˜Kšœ žœ1˜@K˜K˜—šœžœžœ˜Kšžœ˜K˜Kšœ žœžœ˜Kšœ žœ˜Kšœ žœ˜K˜šΟbœžœ™9Kšžœ)žœžœ™7K™Kšžœ žœ™2K™K™—šΠbn œžœ žœžœ˜.Kšœ žœ˜Kšœžœ˜-šžœžœžœ ž˜K˜0Kšžœ žœžœ˜Kšžœ˜—K˜K˜—šΟnœžœ žœ˜,Kš ‘œžœžœžœΟc˜DKšœ7˜7Kšœc˜cKšœ4žœ˜:Kšœ žœ˜K˜—K˜—K˜K™™(K™Kšœ Οr+™7—K™—…—Z7