<<>> <> <> New features Desired 76. January 27, 1988 3:12:02 pm PST want to separate voice balloons from remaining UI, so even non-Finchers can see easily which chars have voice. 75. January 27, 1988 2:54:29 pm PST want FindVoice button would work analogously to Find button, search backward or forward in doc for voice. Currently can use EditTool Property section to search backward or forward for voice char prop, with value pattern: * 74. January 26, 1988 2:41:34 pm PST add Voice menu button to existing Tioga viewers at TiogaVoice startup. [Pier] in progress; 2 problems: 1. how to tell a Tioga viewer. viewer.class.flavor=$Text gets WalnutVoice viewers too, viewer.menu=old TiogaMenuOps.tiogaMenu doesn't work either -- it seems to be different for different Tioga viewers. 2. ViewerOps.PaintViewer[viewer, client] doesn't seem to paint all of the voice balloons - it may paint only a subset in a given viewer => a bug in character artwork? ViewerOps.PaintEverything[] does work, but is pretty disruptive. need help from Michael. 73. January 23, 1988 6:39:31 pm PST Need new WalnutVoice!!! Currently, since the Tioga store/save processing adds the "run TiogaVoice" property, there is no indication that a message contains voice. 72. January 23, 1988 6:37:48 pm PST Try to allow color approximation on monochrome display. Have voiceplay10.newks & voiceprofile10.newks that is an attempt at this. Sort of works; get some comments. 71. January 13, 1988 4:05:56 pm PST Desiderata re: permanent textual annotations RemoveTextMarkers exists as a public proc, but there is no user interface for it yet. Implement shift-select text into a voice viewer as a textual annotation. Implement shift-select out of a voice viewer to grab the textual annotation(s). Implement search through textual annotations; these will obviously use the whole annotation, not just the part displayed. 66. January 11, 1988 10:36:00 am PST Requests from voice group re Tiogavoice: 1. Release! -- done January 20, 1988 4:43:56 pm PST 2. change balloons - always same size, between lines rather than around character. Could perhaps put voice viewer #s inside balloon. 3. change open voice viewer indicators - small bold sans-serif font. Gray font too hard to read. Could retain gray box. 4. DCS: AdjustSilences a. have cmd that takes Tioga selection & sets Adjust parameter (= cmd tool fn), or that just uses it for this operation. b. use current voice selection size as Adjust parameter 5. Can remove Redraw fn - users can close & open viewer. -- done Jan 11, 1988 56. July 19, 1987 4:14:31 pm PDT Re: registering for reports for playback requests. The current TV design says that editing ahead of the playback cue does not change the playback request, but the cue goes into hyperspace (Dan's term for it) during playback of a deleted portion and skips over an inserted portion. This is a pain because it means that VoiceRope requestIDs need not be one-for-one with the items in the playback queue after one of these edits (see VoicePlayBackImpl.RedrawViewer). To continue with this behavior, need to have yet another bit that says whether this request a) expects a $finished report from Finch/Thrush or b) automatically goes on to the following request. Another way to handle this problem, which may in fact model text editing better, would be to flush all requests made later than the one ahead of the playback cue, reissue that request with the new voicerope, and reissue all later requests. If the request is currently playing, reissue from the current playback spot (or maybe a bit earlier). Try this sometime!! 30. June 3, 1987 1:11:24 pm PDT Voice viewers have no Reset button => must Destroy & EditVoice to accomplish Reset. Completed 70. September 12, 1988 9:41:39 pm PDT Allow voice viewers to become empty => easier editing. Inhibit VoiceViewersImpl.ReplaceSelectionWithSavedInterval from destroying; voice viewer Save and Store now check for empty viewers & refuse to save/store. 69. September 12, 1988 9:41:39 pm PDT Changes to allow clients to alter button behaviors via Tioga registry (for WalnutTiogaVoice) TiogaVoicePrivate, VoiceInTextImpl, VoiceRecordImpl, VoicePlaybackImpl. maybe there should now be a TiogaVoice interface??? 68. January 21, 1988 3:52:09 pm PST Guard DeleteLinks button in Tioga viewers; requested by Pier 67. January 11, 1988 6:36:13 pm PST Change VoiceInTextImpl: make docs with voice complain if opened when TiogaVoice not loaded (uses style machinery & Postfix properties on root node). Remaining flaw: does not explicitly test for Artwork on, since there is no style parameter yet that holds this value (currently need to call a procedure; can't from properties). Conversation with Plass & Beach. Other possibilities: Wanted node that would behave similarly to Artwork nodes: would paint text when my code & Artwork off, otherwise would disappear (using $Mark property invisible). Completely disappearing is hard, because that node interferes with leading computations for the surrounding nodes. Also, where to put the code to do the tests if my code isn't loaded? $DependsOnPackages property for root node; reduces likelihood that user or other bad citizen-code will clear Postfix property. Still some insecurity. 39. June 16, 1987 2:07:55 pm PDT Documentation. Include voice in doc. minor work 29 June 87 & 5 Nov 87; begun in earnest 21 Dec 87; final touches 20 Jan 88. Stopped to do PopUpButtons integration: 7-14 Jan 88; made existing painting flaws worse, so took an extra several days to squash. Included pictures of new screens and archaeology of Ades voice ropes for inclusion. 37. June 15, 1987 2:07:55 pm PDT Use PopUpButtons to document the different options for Mark in a voice viewer? With integrated Help facility? July 14, 1987 4:24:28 pm PDT Could integrate DeleteMarks with the Mark button too (eg SHIFT-middle-click). 23. May 19, 1987 6:36:50 pm PDT Changed voiceplay10.ks to show feedback even in silent intervals, in such a way that you can still see the boundaries between sound and silence. Bugs Outstanding 2. September 12, 1988 10:37:38 pm PDT Think about reducing the size of VoicePlaybackImpl.waitForReportTime to 30 sec perhaps (from 100) if could detect cases in which the report is failing to return from Thrush? 2. September 12, 1988 10:37:38 pm PDT Playback request as old request is completing can fail to find a valid conversation by the time it needs it. The Thrush hold feature may fix this. 1. January 18, 1988 3:07:39 pm PST Bugs in EditVoice. If you select one char & button EditVoice & then select another char before that one has had time to open, there will be 2 flaws: the first char will not get an open voice balloon (& won't know where to save itself) the second voice rope will come out without the light and dark pieces (and empty capillary, but of the right length?). Fixed 78. September 12, 1988 9:41:39 pm PDT Fix long-standing voice playback bug Bug caused user workstation to hang during playback without voice viewers (esp annoying during video shoot 3/88 and during script playback). VoicePlaybackImpl: Keep nextTime from growing when a succession of requests are queued without voice viewers & cues. What was happening was that as long as the playback queue wasn't empty when a new request was queued, 100 sec was added to playBackState.nextTime each time the playback process woke up, without regard to what time it was now. Thus a succession of requests could easily get the outer PlayBackProcess loop to think it had wrapped the pulse timer around, causing it to go into a very busy high priority loop that could essentially lock up the machine completely. Also signal playBackCue immediately when an abort is received; not sure whether this really does any good. 80. January 23, 1988 6:46:53 pm PST Ken Pier: Pushing Voice, Places, or Level buttons in Remember event viewer => AddressFault; also an extra blank line in the middle. VoiceInTextImpl: voiceMenu line was created in TiogaMenuOps.tiogaMenu & then removed, leaving tiogaMenu with a NIL entry. Didn't matter for ordinary Tioga viewers, because they were fixed up afterwards. Disastrous for Remember viewers, however. 79. January 22, 1988 4:52:15 pm PST VoiceInTextImpl: user message (in MessageWindow) improvements + try to clear if operation succeeded (EditVoice, StoreVoice, DeleteVoice, PlayVoice) 78. January 21, 1988 3:45:39 pm PST Stress testing by Ken Pier (pushing all voice buttons with|without appropriate selections) uncovered several bugs, eg: AddressFault when DeleteVoice of char with no voice; AddressFault when DeleteVoice with no selection. Fixes: 1. In VoiceInTextImpl.DeleteVoiceFromChar fix of 15 Jan, I managed to italicize a crucial stmt rather than commenting it out -- OOPS! 2. Protect ApplyToCharsInPrimarySelection from TiogaOps.NoSelection errors. 3. Protect all TextEdit.PutCharProp calls from node=NIL (AddressFault), or position>Size[node] (BoundsFault) 4. Protect all TextEdit.GetCharProp calls from node=NIL (AddressFault) 77. January 20, 1988 4:57:41 am PST Bug in interest registration: blows up if bad file name is given to copy. Fix: Catch FS.Error on first file access in VoiceInTextImpl.RegisterInterest and bail out. Presumably whoever called whatever triggered it will complain. 76. January 19, 1988 5:38:55 pm PST Bug when doing a ReplaceFromSelection on the entire rope in a voice viewer. Old TiogaVoice did not have a fault, but it did orphan the old nondestroyable viewer. Deleting the entire rope causes the voice viewer to be destroyed, and then a new one is created. But editInProgress is still TRUE for the old viewer, so it refuses to be destroyed. Then when the recording finishes (in a different process, so there could be races?) the request to AgeAllViewers tries to ReColor the viewer whose Tioga portion is now gone => AddressFault (node=NIL). (It was also just destroying the $Text viewer, rather than the whole thing.) Fix: to VoiceViewersImpl.ReplaceSelectionWithSavedInterval; set editInProgress for old viewer FALSE so it can be destroyed & destroy viewer.parent. Similar problem in VoiceRecordImpl.StopRecording, when a newly-recorded bit of voice turns out to be NIL. Actually, I don't really like the idea of destroying voice viewers when they become empty; maybe should fix it. 75. January 19, 1988 2:38:12 pm PST Finally got the multiple paints licked. Even the old TiogaVoice had multiple paints, so there! Combination of using ViewerForkers.ForkPaint with tryShortCuts=TRUE (rather than PaintViewer) in VoiceMarkersImpl.ReColorViewer; and locking the viewer (possibly repeatedly) during the creation of its insides in VoiceViewersImpl, so no one can paint until it's all done. 73. January 15, 1988 4:09:52 pm PST Changed VoiceInTextImpl.DeleteVoice to omit setting voice viewer edited bit if voice viewer is open. Doesn't really represent a voice edit. Ideally, the [edited] bit in a voice viewer might show whether its contents are stored anywhere. But checking this in DeleteVoice only accomplishes part of this, because deleting an annotated character also deletes the voice (and the user might hit Reset in the doc anyway). Should also see whether there are any more copies of this source marker/voice rope in this doc before breaking links or indicating edited. 72. January 15, 1988 4:08:40 pm PST Made dictation ops always go to end of fresh voice, even on monochrome display (used to go to end of viewer on monochrome). Changed VoiceMarkersImpl.FindEnd. 70. January 13, 1988 12:09:44 pm PST Fixes to PlayFromSelection and ResumeFromSelection (in VoiceMarkersImpl). Inhibit PlayFromSelection and ResumeFromSelection if selection is not in this viewer. Also MarkAtSelection and DeleteSelectionMarks. 69. January 12, 1988 4:14:16 pm PST Store voice viewer at point selection with no following char gives an ERROR (an original bug from SAdes). Turns out that the AddVoice and Store code are pretty convoluted, and don't share as much code as they probably should. Lots of the same tests seem to be done over before the recording & after it. It is of course necessary to take a snapshot of the Tioga selection before recording starts, because the user could do all sorts of things during a lengthy recording. Note that a point selection is fine if there is a following char in that node. In that case, could move to the preceding char if there is one. VoiceViewersImpl.StoreVoice VoiceInTextImpl.StoreVoiceAtSelection (see PrepareSelection below, code very similar) new: checks for point selection with no following char, try preceding char if there is one if no preceding char, complain to user VoiceRecordImpl.AddVoiceProc ENTRY VoiceRecordImpl.PrepareSelection INTERNAL (maybe this is why there is less sharing than you might expect) checks for some Tioga selection -- does not check for point selection! checks for selection in Tioga text viewer (not voice viewer) removes old voice if selection is pending delete (leaves chars) new: checks for point selection with no following char, try preceding char if there is one if no preceding char, will notice later when recording completes checks for voice edits in progress checks for voice at selection (but if selection is a point, this checks the following char. if there is no following char, the check returns quietly) if any of the checks fail, reports error to user marks char with TextKey $recordingMark if selection OK, VoiceRecordImpl.StartRecording VoiceRecordImpl.StopRecording if can't find the $recordingMark TextKey, or there is a point selection at the end of a node, or there is voice at that character by the time that recording completes put the recorded voice in a new voice viewer for the user to store where desired. 68. January 12, 1988 10:40:28 am PST Change color of open voice annotation bubbles For readability: tried textColor w/ textBrightness increased (or decreased) by .2, rather than explicit stipples. Put back to original because they were no more readable, and besides they changed as you scrolled the doc (according to what scan line they were on). 65. January 7, 1988 12:43:57 pm PST. Replace Tioga menus with PopUpButtons in voice viewers to document different mouse button functions. Tried just stuffing PopUpButtons on top of blank Viewers menu (MenuEntries have type conflicts w PopUpButtons) -- didn't get it quite right, and it probably wouldn't have worked anyhow -- a crock. So made voice viewers a Containers.Container with a $Text viewer inside and a line of PopUpButtons at the top. Left VoiceViewerInfo pointing at the $Text viewer, so most operations will still traffic in the actual voice $Text viewer, and only a few operations will need to translate from it to the container (its parent) or vice versa (its first child). a. ViewerOps.PaintViewer calls should paint text viewer or container? b. managing edited bits may be difficult -- no, all controlled through MakeVoiceEdited|MakeVoiceNotEdited|SetVoiceViewerEditStatus calls to MakeVoiceEdited: in VoiceViewersImpl: Delete, Copy (source & dest) in VoiceRecordImpl: NewRecordingMarker, AddVoice (if no text char to add to), various other places in AddVoice (overkill somewhere here) in VoiceMarkersImpl: TextInput, Back, RemoveTextMarkers, AdjustSilences in VoiceInTextImpl: DeleteVoiceFromChar (can no longer guarantee that rope is stored anywhere) SetVoiceViewerEditStatus may not be needed any more, since Tioga won't be contributing its own thoughts to the container's edited bit. c. MBQueue -ing -- done d. redo old menu|button procs to take PopUpButtonProcs or MBQueue stuff e. Destroy and ChangeColumn events were placed on container. Trying now on $Text viewer, maybe will work -- Doesn't work, so back to container; changed procs dealing with those events. f. some painting problems: viewer contents seem to paint one extra time! only possible culprit: VoiceMarkersImpl.ReColorViewer, called from VoicePlaybackImpl.RedrawViewer 64. December 30, 1987 1:38:21 pm PST Edit history color choice. <> ageColors[1] _ "0.13 0.97 0.96 textColor"; -- vivid orange yellow ageColors[2] _ "0.06 0.94 1.00 textColor"; -- lightish vivid yellow orange ageColors[3] _ "0.99 1.00 1.00 textColor"; -- vivid red ageColors[4] _ "0.99 1.00 0.65 textColor"; -- vivid red (dark) ageColors[5] _ ageColors[6] _ "0.97 1.00 0.28 textColor"; -- dark vivid magenta red; last two must be the same <> <<>> <> ageColors[1] _ "0.130 1.00 1.00 textColor"; -- vivid orange yellow ageColors[2] _ "0.060 0.90 1.00 textColor"; -- lightish vivid yellow orange ageColors[3] _ "0.000 1.00 1.00 textColor"; -- vivid red ageColors[4] _ "0.000 1.00 0.50 textColor"; -- darkish vivid red ageColors[5] _ ageColors[6] _ "0.000 1.00 0.00 textColor"; -- black; last two must be the same <> ageColors[1] _ "0.167 1.00 1.00 textColor"; -- vivid yellow ageColors[2] _ "0.125 1.00 1.00 textColor"; -- vivid orangish yellow ageColors[3] _ "0.100 1.00 1.00 textColor"; -- vivid yellow orange ageColors[4] _ "0.050 1.00 1.00 textColor"; -- vivid orange ageColors[5] _ "0.000 1.00 1.00 textColor"; -- vivid red ageColors[6] _ "0.000 1.00 0.75 textColor"; -- vivid red (dark) ageColors[7] _ "0.000 1.00 0.40 textColor"; -- dark vivid red ageColors[8] _ ageColors[9] _ "0.000 1.00 0.00 textColor"; -- black; last two must be the same <> ageColors[1] _ "0.000 1.00 1.00 textColor"; -- vivid red ; = 1 1 1 ageColors[2] _ "0.825 1.00 1.00 textColor"; -- vivid magenta ageColors[3] _ "0.730 1.00 1.00 textColor"; -- vivid purple ageColors[4] _ "0.667 1.00 1.00 textColor"; -- vivid blue ageColors[5] _ ageColors[6] _ "0.000 1.00 0.00 textColor"; -- black; last two must be the same <> ageColors[1] _ "0.000 0.50 1.00 textColor"; -- light vivid red ageColors[2] _ "0.000 1.00 1.00 textColor"; -- vivid red ; = 1 1 1 ageColors[3] _ "0.000 1.00 0.75 textColor"; -- vivid red (dark) ageColors[4] _ "0.000 1.00 0.40 textColor"; -- dark vivid red ageColors[5] _ ageColors[6] _ "0.000 1.00 0.00 textColor"; -- black; last two must be the same Try asking Maureen if there are tables or papers about this. Avi/Alain paper? 63. December 29, 1987 1:31:34 pm PST Voice viewer painting bug. I thought this was fixed, but voice viewers are painted twice after every change (only on color display, seems to be a color display problem). 62. December 29, 1987 1:12:56 pm PST Bug in copying voice with textual annotations. Copy a voice segment with >1 annotations => only first is copied. December 29, 1987 3:11:01 pm PST VoiceMarkersImpl.EditTextMarks was copying the first annotation in the segment repeatedly (as many times as there were annotations in the segment). 61. December 28, 1987 2:55:04 pm PST Bug in talks bubble painting. Spaces in open voice viewer indicators ("Sound Viewer #n") are sometimes stretched by later Tioga justification, so the words fall outside the rectangle onto other characters in the line. December 29, 1987 11:56:45 am PST Set space size & enclose talks bubble painting in an Imager.DoSave. 60. July 23, 1987 4:02:20 pm PDT Raising errors in VoiceRope rather than returning nbs. VoiceRopeServerImpl nb values VoiceRopeDB errors: as in LoganBerry Jukebox errors: $voiceStreamFailure $noSuchVoiceRope, $badVoiceRope 59. July 19, 1987 5:32:45 pm PDT Got a "finish edit before destroying viewer" msg after deleting all voice in a voice viewer so as to be able to copy other voice in - don't know how to finish it, so that viewer is now stuck. This business of destroying viewers instantly they become empty is inconvenient for trying to edit a new piece of voice into existence. 58. July 19, 1987 5:16:04 pm PDT (RJB) Left-Mark doesn't always insert a temporary mark at the current playback position - sometimes it's ignored. 57. July 19, 1987 5:15:06 pm PDT (RJB) AdjustSilences doesn't adjust the locations of text annotations or temporary marker positions properly - it appears to get off by one with each successive replacement. Also, it seems to work from the end of the rope backward, repainting the viewer each time it shortens a silence. For the FrenchDialogue, this is incredibly painful to watch. Better to recompute totally and then display. 55. July 13, 1987 6:48:56 pm PDT Handling Thrush/Bluejay errors: current TiogaVoicePackage when recording, a separate process waits for non-NIL rope to be returned (I guess the main process is often busy inserting feedback triangles into a voice window) playback request does not ask to wait all timing/feedback done open loop, without intercepting Finch reports VoiceRope interface Record returns NIL if anything failed (no NBs or other error codes) Playback can be asked to wait until the connection has been made successfully or has failed VoiceRopeImpl registers with FinchSmarts for action reports & conv state issues its own error messages to VoiceUtils.Problem FinchSmarts interface allows registration for system state, action reports, conv state Bluejay does not report some errors well, eg a full jukebox new TiogaVoicePackage record: 1. set the global recorded rope to a dummy value and wait for it to become something else 2. register with FinchSmarts for reports and queue up open requests. Would allow a less open-loop feedback impl: wait until the $started report to begin inserting feedback chars. a. manufacture an ID and make VoiceRope use it b. have VoiceRope return the ID registered for a given request doesn't quite work, because VoiceRope.Record doesn't return until recording is complete. c. have a callback to notify of ID d. have a GenerateRequestID proc in VoiceRope; get a new one, and pass it in (with appropriate checks that it is plausible?) 3. alter VoiceRope to return an nb-type code (wouldn't catch cases that start ok but fail later). 4. provide a notify callback to inform about any reports for this call (essentially registering with VoiceRope for reports rather than with FinchSmarts). playback: can't ask to wait because that would disturb the button interface and the queueing. 1. register for reports and queue up open requests (could just add a field to current playback queue). Would allow a less open-loop feedback impl: wait until the $started report to begin feedback cue. 2. alter VoiceRope to return an nb-type code (wouldn't catch cases that start ok but fail later). Fewer failures possible here than in the record case. 54. July 9, 1987 3:02:26 pm PDT Desirable feature: have some way to grab the n chars or words at the point of an annotation and stuff them into a voice viewer. Useful for cases like language tutorial docs, in which the speech is a verbal version of the text. Maybe sufficient would be to allow shift-select from a text viewer into a voice viewer, as a text annotation. 53. July 9, 1987 1:12:34 pm PDT Possible problem with Viewers & Tioga locking: ViewerAndTiogaLocking.tioga says: "Split viewers are not always properly locked. For example, when a document is locked, only its root viewer is locked along with it. This is adequate except for operations that change the root of a document. Such operations must acquire write locks for all of the split viewers." Don't know if this affects TiogaVoice or not. 50. sound viewer markers as hints: bugs a. June 22, 1987 2:51:57 pm PDT Can't change doc in paintproc because paintproc holds read lock => check source marker links but don't destroy in paintproc => copying open source marker to another doc closes the marker (as it should), but copying it back yields an open source marker when it returns to the original doc. Could fork a process to break the link, but there could be races with user activity. b. June 22, 1987 7:58:22 pm PDT (JDM) Copy open source marker; destroy voice viewer; edit assoc old text spot again => "TEditFormatImpl Character Artwork Format bug" in msgwindow. Also perhaps when trying to edit voice on char that has invisible $voiceWindow property? July 9, 1987 5:31:01 pm PDT Can get an addr fault here w/ TiogaOps.ViewerDoc[NIL], apparently because the talks bubble paint proc has been triggered in the middle of creating the new voice window. So there is a voiceViewerInfo, but parentViewer is still NIL. The new VoiceInTextImpl I have now is wrong about the NIL case -- think about what to do. Part of the problem is related to #d, which might be solved by monotonically increasing voice viewer numbers throughout a session, rather than reusing the numbers as now. $voiceWindow props do not survive across sessions because they are refs (although I still don't quite understand why this doesn't complain later). Need to make sure that this will solve the problem. Could also store a direct ptr to the viewer in the $voiceWindow prop, if that would help check things. ValidateSourceMarker is called from DeleteVoiceFromChar (public), SearchForVoice (in EditVoiceProc (menuproc)), RecordVoiceInstancesAtRoot, TalksBubbleFormat (artwork proc). c. July 7, 1987 8:50:18 pm PDT Store open voice viewer at new spot (or something like that) => "TEditFormatImpl Character Artwork Format bug" in msgwindow. No multiple docs involved, but there was an earlier crash with an emergency save that might have left bad $voiceWindow properties around. Also, VoiceInTextImpl.ValidateSourceMarker blew up later with viewerInfo.parentViewer=NIL, because TiogaOps.ViewerDoc isn't really happy with a NIL arg. d. July 9, 1987 3:44:32 pm PDT Store into doc that had text with open viewer copied into it makes the copied location look valid again, so get multiple locations for the voice viewer. This together with the fact that the $voiceWindow prop has no ref to the viewer itself (and it would be difficult to guarantee that it was the same viewer anyway rather than a reuse of the viewer record) can link up items that only share the same sound viewer number, rather than the underlying voice rope (suppose that the original viewer of that number was deleted while it was connected to a different doc). July 10, 1987 7:30:55 pm PDT Fixed all of the above. 2 changes: Fork a process from the paintproc to break the link (may be races here in future?), and make voice viewer numbers monotonically increasing throughout a session, rather than reusing the numbers as before. e. July 10, 1987 7:43:56 pm PDT Store voice viewer into same doc as its original location: no source marker! July 10, 1987 8:25:40 pm PDT VoiceInTextImpl.DeleteSourceMarkers was being too aggressive - the exceptionLoc stuff wasn't working properly. 49. June 22, 1987 7:57:33 pm PDT (JDM) Where is playback feedback when left click Play in voice viewer and no selection? 48. June 22, 1987 3:21:09 pm PDT Bug in copying pending-delete voice with text markers when source and dest are in the same voice viewer (addr fault when redrawing text markers). June 22, 1987 7:25:27 pm PDT caused by redrawing in the middle and thus destroying the dest node. VoiceViewersImpl: Copy, ReplaceSelectionWithSavedInterval. 47. June 22, 1987 1:01:48 pm PDT Minor TVPrivate: DeleteSourceMarkers should have exceptionLoc default to NIL, call in VoiceViewersImpl.DestroyVoiceInfo should utilize. 46. June 19, 1987 2:02:25 pm PDT If no root is specified, TiogaOps.CallWithLocks locks only the selection and may raise NoSelection: ERROR. TV may wish to use some other locking mechanism when no selection is involved. approx June 19, 1987 Checked - ok. 45. June 18, 1987 5:25:25 pm PDT When EditVoice; delete, the icon becomes edited (caption=New File currently), but Destroy isn't guarded. New Dictation Machine windows have guarded Destroy buttons. What is different? 44. June 18, 1987 4:25:27 pm PDT Would like a new ShowLink command in a voice viewer to show (all) places in its parent doc where this viewer would be stored. 43. After Tioga provides notification on copy/move to other docs, can accelerate Save of text docs without voice: Place $ContainsVoice property on root node of doc whenever record voice into, store voice into, or copy/move char that contains voice. Could even consider incremental update of $voicelist root property. 42. June 17, 1987 7:45:02 pm PDT voice markers as hints in progress (see #41): VoiceViewersImpl GetVoiceViewerNumber GetVoiceViewerInfo VoiceViewerAttachmentValid VoiceInTextImpl ----------- Should only set viewerInfo values or char props under monitor/Tioga locks can't get rope from ViewerInfo DeleteVoiceFromChar have: TiogaOpsDefs.Location, TextNode.Ref want: true link?, voiceViewer, ViewerInfo (to remove link) SearchForVoice have: TiogaOpsDefs.Location, TextNode.Ref want: true link? AddVoiceWindowProps have: TiogaOpsDefs.Location, TextNode.Ref want: true link? (maybe should already have been fixed up) DeleteSourceMarker have: parent viewer, TiogaOpsDefs.Location, TextNode.Ref want: true link?, all linked text locs GetVoiceWindowRope have: TextNode.Ref, offset want: Rope (not clear this is really useful) SaveRopeAtSourceMarker have: parent viewer, TiogaOpsDefs.Location, TextNode.Ref want: all linked text locs DeleteLinks/RemoveAnySourceMarker have: viewer, TiogaOpsDefs.Location, TextNode.Ref want: all linked text locs RecordVoiceInstancesAtRoot have: viewer, rootnode, TextNode.Ref/viewer+property want: true link?, viewerInfo.edited if so TalksBubbleFormat have: TextNode.Location want: true link?, rope if so Option 1: TextNode.Ref, offset => valid, viewerInfo Option 2: VoiceWindowRef, TextNode.Ref => valid, viewerInfo ----------- TalksBubbleFormat RecordVoiceInstancesAtRoot (voiceWindowRope currently wrong) RecordVoiceInstancesAtRoot: PROC [viewer: ViewerClasses.Viewer] RETURNS [quit: BOOL _ FALSE] = { wholeFile: TiogaAccess.Reader _ TiogaAccess.FromViewer[viewer]; soundsInDocument: INT _ 0; rootNode: TextNode.Ref; voiceList: Rope.ROPE _ NIL; userConfirmed: BOOL _ FALSE; DebugRope["Voice messages in document:"]; IF NOT TiogaAccess.EndOf[wholeFile] THEN DO heavyChar: TiogaAccess.TiogaChar _ TiogaAccess.Get[wholeFile]; voiceRope: Rope.ROPE; voiceWindowRef: TiogaVoicePrivate.VoiceWindowRef; IF TiogaAccess.EndOf[wholeFile] THEN EXIT; voiceWindowRef _ NARROW[Atom.GetProp[$voiceWindow, heavyChar.propList]]; IF voiceWindowRef#NIL THEN { viewerInfo: TiogaVoicePrivate.VoiceViewerInfo _ TiogaVoicePrivate.GetVoiceViewerInfo[voiceWindowRef]; <> IF NOT userConfirmed AND SameViewerDoc[viewer, viewerInfo.parentViewer] AND viewerInfo.edited THEN { IF NOT MessageWindow.Confirm["Confirm discard of voice edits . . . "] THEN { MessageWindow.Append["Save aborted."]; RETURN[TRUE]; } ELSE userConfirmed _ TRUE; }; voiceRope _ NARROW[Atom.GetProp[$voice, heavyChar.propList]]; IF voiceRope#NIL THEN { DebugRope["\n"]; DebugRope[voiceRope]; soundsInDocument _ soundsInDocument + 1; voiceList _ Rope.Cat[voiceList, "&", voiceRope]; }; ENDLOOP; rootNode _ TiogaButtons.TextNodeRef[TiogaOps.ViewerDoc[viewer]]; TextEdit.PutProp[rootNode, $voicelist, voiceList]; IF soundsInDocument = 0 THEN DebugRope[" none\n"] ELSE DebugRope["\n"] }; 41. June 17, 1987 4:33:10 pm PDT From RJB: could search entire doc for $voiceWindow props to support copies within a single doc. Could remove $voiceWindow prop in PaintProc if points to wrong doc (must search splits though). This would effectively break the links for copying, moving across doc boundaries. Could also implement lists in the PaintProc. June 20, 1987 11:20:18 pm PDT New policy: voice markers in text viewers are only a hint; must be validated (whenever possible: painting talks bubbles, saving doc, etc.). Voice markers can't be copied or moved across doc boundaries. Search entire doc to support text copies within a single doc (so they will match the user view). [NOTE: could have only one link by keeping up with copy/move in the paintproc (updating voiceViewerInfo.positionInParent as needed)]. 40. June 17, 1987 4:33:07 pm PDT From RJB: request confirmation of loss of edits when saving a text doc containing a pointer to an edited voice viewer. June 18, 1987 2:16:09 pm PDT VoiceInTextImpl.RecordVoiceInstancesAtRoot. New feature: request confirmation of loss of edits when saving a text doc containing a pointer to an edited voice viewer. 38. June 15, 1987 2:35:22 pm PDT Need to test: Deleting the contents of a voice viewer seems to destroy the viewer. What then happens to any text location that was related to that voice viewer? It's as you'd expect: the sound viewer disappears, leaving the original voice balloon on the character. The way to delete sound and record new is to DeleteVoice on the character and start over. Can DeleteVoice on an open balloon, which breaks the link, but leaves the voice viewer. 36. June 12, 1987 4:27:14 pm PDT TiogaVoice currently tracks the parent viewer for a voice viewer. Split followed by destroy original viewer will thus confuse it => "voice viewer has no parent viewer!", although the source markers will be visible. Option 1: ViewerClasses.Viewer.link holds a circular list of split viewers. Can register with ViewerEvents to track all creates & maybe destroys of $Text viewers, and put these additional viewers in a list that we need to look at for having voice, and substituting as needed if the original viewer is destroyed. Option 2: keep a parent document rather than a parent viewer (why is a parent viewer needed/good for anything anyway? Because it's quick, also easy to watch if that viewer is destroyed, i.e, Split;Destroy breaks the link). users of parentViewer VoiceViewersImpl SetParentViewer: PUBLIC PROC caller: VoiceInTextImpl.EditVoiceProc RemoveParentViewer: PUBLIC PROC caller: VoiceInTextImpl.DeleteVoiceFromChar StoreVoice: Menus.MenuProc SaveVoice: Menus.MenuProc DestroyVoiceInfo: PROC VoiceInTextImpl StoreVoiceAtSelection: PUBLIC PROC EditVoiceProc: Menus.MenuProc RemoveParentPointersTo: PUBLIC PROC TrackDeletes: PUBLIC PROC Option 3: use Tioga's TextKeys, which would need to be modified to a) cross document boundaries, b) not require a node hint, c) have multiplicity(?) Option 4: (?) June 17, 1987 11:11:34 am PDT VoiceInTextImpl.RemoveParentPointersTo: Link to sibling split text viewer if appropriate when text viewer destroyed. 35. June 10, 1987 4:56:49 pm PDT To edit a character that contains voice, you might EditVoice on that char, replace the char with the desired one, and then store the voice viewer back in that spot. This operation currently gets address faults from VoiceInTextImpl.DoIt|14554 too. June 12, 1987 5:48:29 pm PDT Changed VoiceInTextImpl to treat TiogaVoicePrivate.VoiceViewerInfo.positionInParent as a hint only; search the parent for the correct $voiceWindow property if it's not where you thought it would be. 34. June 9, 1987 6:58:24 pm PDT If you copy a character that has an open sound viewer to some other part of the doc, you will get a char that thinks it has an associated voice viewer, but is in fact completely unrelated. Need to intercept the copy command between/within text viewers, and either remove the voice properties or record multiple associations with the text (could be in different files). The former is probably easier to handle for now, at least. What you really want is to copy the voice property to the new location, remove the voiceWindow property from the old location, and add the voiceWindow property to the new location. June 10, 1987 4:31:48 pm PDT This means monitoring all text-to-text copies. For speed, may want to associate a property flag with a viewer (or Tioga doc) that indicates whether the viewer/doc has any voice in it -- this would be valid before Tioga Saves. Might speed up Saves too. Note: probably only interested in open voice, so might not be that useful for speeding up Tioga Saves. psel ssel dir result not not s->p copy[s, p] => 1 p, 2 s = shift-SEL not not p->s copy[p, s] => 2 p, 1 s = ^S pend not s->p del[p] + copy[s, p] => 0 p, 2 s = pending shift-SEL pend not p->s move[p, s] => 1 p, 1 s = ^Z not pend s->p move[s, p] => 1 p, 1 s = ^shift-SEL not pend p->s -- not possible pend pend s->p del[p] + move[s, p] => 0 p, 1 s = pending ^shift-SEL pend pend p->s -- not possible + transpose transpose[p, s] => 1p, 1s June 12, 1987 6:51:53 pm PDT Does text UNDO create even more trouble with tracking these events??? 33. June 8, 1987 10:01:26 pm PDT Have a new voice viewer icon, but need to find all places where voice viewers become edited to set the dirty icon properly. June 15, 1987 5:05:33 pm PDT Including the new viewer created if no place to store the voice when recording finished. June 17, 1987 10:48:53 am PDT ways to make voice viewer edited: 1. record new voice into viewer - VoiceRecordImpl.NewRecordingMarker IF NOT viewer.newVersion THEN TiogaVoicePrivate.MakeVoiceEdited[viewer]; 2. edit voice: move, transpose, copy, delete VoiceViewersImpl: Delete, Copy VoiceMarkersImpl.AdjustSilences 3. edit text markers: insert or delete chars/markers VoiceMarkersImpl: TextInput, Back, RemoveTextMarkers 4. no place to store newly recorded voice in text viewer VoiceRecordImpl.StopRecording 5. delete text connected to a voice viewer VoiceInTextImpl.DeleteVoiceFromChar ways to make not edited 1. store - VoiceViewersImpl.StoreVoice 2. save - VoiceViewersImpl.SaveVoice 32. June 8, 1987 8:25:33 pm PDT Editing silence into a voice rope seems to confuse someone about how long the rope is. A request to play the entire rope causes the voice file server to play just the silence, although TV shows feedback for the whole viewer. Similarly, removing silence seems to shorten the rope (perhaps), and it does not actually remove any silence. June 15, 1987 2:03:45 pm PDT 2 Bluejay problems: 1 fixed, and the other a performance problem by which it takes longer to start to play back a new rope than a 1-char deletion, so deleting silence in that way does not sound like it has done anything. 31. June 5, 1987 4:20:37 pm PDT Voice viewers are currently $Text viewers, using Tioga's TIP table & new notify proc that then calls Tioga when needed. At least a new TIP table, if not a new viewer class?? TiogaFileWatcherImpl tries to save all $Text viewers when the user types shift-shift-swat (?? - maybe it really checks for loading new file while editing older version). This can only work if the enumeration finds the voice viewers before the text viewers, since saving a voice viewer edits its corresponding text viewer. 29. May 29, 1987 1:29:18 pm PDT Select balloon; EditVoice; Store in new loc (closes old text loc); open old loc; Save both voice viewers; Destroy Viewer #1 (corres to new loc) => new text loc does not close!!; Destroy Viewer #2 (corres to old loc) => closes correctly. July 21, 1987 9:55:28 pm PDT No longer true; not sure what fixed it. 28. May 29, 1987 11:13:51 am PDT Possible FINCH bug: select voice balloon and click Play. Then click Stop. Finch never got a report that the conversation had stopped, although Finch claimed to be still connected and TiogaVoice knew that playback had finished. PROBABLE THRUSH BUG. 27. May 27, 1987 4:31:02 pm PDT Marks: the Mark button adds a mark at the point selection, or at both ends of a pending-delete selection. This is not so bad now that selections are not used for playback feedback, but I would still like a mode that automatically marks at "the current spot" during playback. May 29, 1987 11:01:16 am PDT Red-button-Mark now marks at the current spot during playback, otherwise uses selection as before. The DictationMachine button automatically adds a mark (at the place where recording began) iff recording is already active. A mark in a quiescent sound viewer would also be nice. Even better if it could allow a Store. June 1, 1987 11:35:32 am PDT Could add a new property $dictationLoc on a char in a voice window to allow a Store. 26. May 22, 1987 8:05:05 pm PDT After any edits, the viewer displays as DPPIAK etc. Problem: The style-setting in VoicePlaybackImpl.RedrawViewer seems to have been necessary. Put it back somehow. May 27, 1987 11:13:46 am PDT Set style in RedrawViewer (without using selections, even!). 25. May 22, 1987 7:59:41 pm PDT Can't delete from a voice viewer at all. VoiceRope.Replace (called from VoiceViewersImpl.ReplaceSelectionWithSavedInterval) seems to be returning NIL when it shouldn't. May 27, 1987 4:07:36 pm PDT Changed VoiceRopeServerImpl.Replace (and a few other routines in that module, for cleanliness) to handle replacing with NIL correctly. Also, why does voiceViewerInfo have a VoiceRopeInterval field rather than a VoiceRope field?? Then the dereference in ReplaceSelection... wouldn't be blowing up there, anyhow. 24. May 19, 1987 6:50:46 pm PDT ML problem resulting from Dan's combining VoicePlayImpl and VoiceRecordImpl into VoiceRecordPlayImpl: entry proc VoiceRecordPlayImpl.StopRecording calls VoiceViewersImpl.ReplaceSelectionWithSavedInterval which calls entry proc VoiceRecordPlayImpl.RedrawViewer (there rather than in VoiceViewersImpl to synchronize with possible playbacks in progress (?)). 1. If recording is in progress then no playback can be in progress. VoiceRecordPlayImpl.StopRecording also calls VoiceRecordPlayImpl.RedrawViewer directly May 22, 1987 7:58:17 pm PDT. Separated VoiceRecordPlayImpl into playback and recording again. 22. May 19, 1987 4:31:30 pm PDT Make sure that VoiceInTextImpl.thrushHandle is updated if Finch/Thrush go away and come back. Not needed -- VoiceRope defaults a NIL parameter correctly. 21. May 19, 1987 4:30:11 pm PDT Should use voice playback reports from Thrush to synchronize beginning/ending of playback cue movement. July 21, 1987 9:52:10 pm PDT End of a week's worth of effort toward that for recording and playback. -------- Above refers to the new TiogaVoice for Finch7.0: includes SAdes fixes from 10/86 (current Finch for Cedar7.0 does not), plus restructured by DCS to have many fewer modules. ---------- 20. May 13, 1987 4:17:10 pm PDT Check interactions with new VoiceRopes?? 19. May 13, 1987 4:02:53 pm PDT Want to allow move, exchange, undo, etc.... 18. May 13, 1987 3:55:59 pm PDT If the call to the recording service fails, TV seems to leave itself in a state where it knows recording is going on, so no further operations are allowed "Stop recording before trying to play back" or "Already recording" February 17, 1987 6:24:36 pm PST Bugs 1-17 17. Once you have inserted a textual marker, say by typing a space, you can never remove the little arrow, no matter how far you backspace. It's not just something cached, because destroying the sound viewer and recreating it displays the arrows again. June 3, 1987 11:36:09 pm PDT By reading the code I discovered that BackWord (^W) had been coopted to remove all text markers in the selection. June 4, 1987 11:47:57 am PDT Changed BackWord to have its normal function for text markers. Changed both BackSpace and BackWord to remove the text marker whenever its length becomes 0. Function still exists to remove all text markers in the selection (RemoveTextMarkers), but no current user interface access. 16. Saving the underlying Tioga document while a voice viewer is open records the talks bubble as open (sound viewer #n) permanently. Saving the sound viewer thereafter does not close the talks bubble. However, destroying the sound viewer does change it back. Maybe saving a sound viewer is not supposed to close the associated talks bubble. Storing it at a new text location closes the old location and opens the newly stored location. Here's what the above remark should say: 16a. Saving the underlying Tioga document while a voice viewer is open records the talks bubble as open (sound viewer #n) permanently. If you then destroy the Tioga viewer before the sound viewer, the file will have an open bubble in it the next time it is opened (whether or not there is a viewer of that name any longer -- and anyway it would have to be the same voice rope and textual annotations). You do get a message in the CommandTool: "detaching parent link for voice viewer 1". Then when you destroy the sound viewer later, you get: "Voice viewer 1 had no parent". You are not allowed to edit the erroneously "open" voice, because TiogaVoice thinks it's already open. June 8, 1987 9:14:54 pm PDT No longer true for 9/86 TV. 16b. Inserting new text earlier in the Tioga viewer than an open annotated spot causes the report: "source marker not found at expected position!!". So the following scenario is a problem: AddVoice, STOP, EditVoice, save Tioga doc (w/ open bubble), edit voice, insert char in Tioga doc before annotated spot, Save sound viewer. Fails with the above report. If you then try to Store the sound viewer at its old spot, you get "cannot add sound on top of sound". EditVoice, edit voice, delete char(s) in Tioga doc before annotated spot, {save Tioga doc (w/ open bubble),} Save sound viewer works ok! -- June 15, 1987 1:54:52 pm PDT Because TV explicitly tracked deletes and adjusted its idea of the sound viewer's backpointer. EditVoice, insert char in Tioga doc before annotated spot, edit voice, Save sound viewer: complaint in the Message Window: "unable to find source marker for voice window: voice not saved", along with the CommandTool report. If you insert 1 char and delete a few chars, it is somehow possible to get a BoundsFault from Tioga trying to find the $voiceWindow character property. June 15, 1987 1:57:56 pm PDT All of the above now fixed, by searching the entire document if need be for the correct $voiceWindow property. Remaining problems: move or transpose to a different document, copying characters with open sound viewers, and splitting documents then destroying the original. 15. Dan would prefer talks bubbles that live on a spot between characters and extend out to possibly obscure line/lines above. There could be text (names, permanent textual annotations, etc.) in these large bubbles. Seems to require planes (21/2D) in Tioga. Maybe you'd do a prototype in Gargoyle? They could be anchored to a group of characters rather than just one, say by reverse videoing the anchoring chars. 14. Textual annotations on earlier pieces of voice are chopped off by textual annotations on later pieces of voice. Adding a CR does not allow the text to extend past the voice tube, but adding enough more voice will reveal the covered text. 13. Adding textual annotations to a sound viewer does not set its edited bit, so TiogaVoice refuses to save it. (I can't seem to reproduce this.) June 3, 1987 12:23:27 pm PDT Does not seem to be true of the current version. 12. Typing a CR in a sound viewer breaks the voice tube into multiple lines. These work correctly during playback. The multiple lines stay over a close/reopen, but editing the voice redraws at least the tail of the voice. Redraw also removes CRs. Interesting: inserting a CR sets the edited bit, but Redraw removes it if there have been no other edits. (How does it do that?) June 5, 1987 12:38:39 pm PDT It turns out that CR goes around the VoiceMarkersImpl.TextInput routines because Tioga.tip does not treat CR as a char. Furthermore, after a CR is inserted, the voice viewer char offsets are out of synch with what TiogaVoice thinks, so editing text markers beyond the CR doesn't work. June 5, 1987 6:17:46 pm PDT Have a new TIP table, but it's not being set onto each voice viewer for some reason. June 7, 1987 All better. New TIP table being set correctly (turns out it can't be done when initializing the viewer, because Tioga will reset it during its initialization, in EnableUserEdits). The new TIP table has the additional feature of disallowing ctrl-CR, which would seriously damage a voice viewer, because voice viewers must have a single node. June 10, 1987 4:28:23 pm PDT BUT: applying Break from the EditTool still works on a voice viewer. Need to trap that. 11. If no character is selected during an AddVoice operation, TiogaVoice blows up when trying to create the talks bubble after recording completes. May 13, 1987 4:04:55 pm PDT Two options: either select some random character (inserting one if the document is empty), or ensure that there is a selection before recording begins (is it called under locks, so you can't change the selection during the recording process?). The first option would solve the WalnutVoice problem for sending "voice-only" messages. June 10, 1987 4:22:11 pm PDT Yet another option: create a voice viewer for the rope in question and give a message that there was no place to store it. Or perhaps force the user to select a character right then - not non-preemptive, though. June 15, 1987 2:53:56 pm PDT Implementation uses TextKeys (why here & not for voice viewer backpointers??). This allows editing during the voice recording process, but TextKeys really only talk about a point in the document, and we need a character to decorate. A. No movement during recording 1. No selection => complains. 2. Point selection in a node with no more chars => blows up. 3. Point selection in a node with following chars => places the annotation on the following char (unless there is already voice on that char, in which case it gives up quietly). B. Movement during recording. 1. End up with point selection in a node with no more chars => blows up. 2. Changing nodes during recording looks like a problem. June 15, 1987 5:03:22 pm PDT Create voice viewer and user message if anything goes wrong with the TextKey above. 10. DeleteMarks [left|middle] deletes the selected mark (in any sound viewer) and scrolls that viewer to the top. It does not complain if no mark is selected. DeleteMarks [right] deletes all marks in its sound viewer and scrolls that viewer to the top. 9. Mark [left|middle|right] inserts a mark at the current selection (in any sound viewer) and scrolls that viewer to the top. If the selection is not in a sound viewer, it complains. 8. The color editing history is maintained over all sound viewers. That seems like the right choice. 7. If you Mark a spot, open a new DictationMachine, and record as desired, you can't Store the DictationMachine at the original spot -- you can only copy it there. Also, if you have several marks, it may be difficult to recall which one to copy to - there aren't enough different colors for the editing history to help. (Using only a selection is even worse, of course, because you will instantly lose your place if you make any other selection anywhere.) 6. I can put voice in a Walnut Sender by clicking AddVoice in a regular Tioga viewer. Of course the interests for that voice will not be managed properly. 5b. When recording from the hands-free microphone, either the beep is too long or recording begins too quickly -- you get a bit of the beep at the start of recording. Recording from the handset is ok. 5a. It feels like DictationMachine should create a selection at the beginning of the new voice when recording begins. That way the user can repeatedly record and review without having to manually add selections. Of course the user could select something else later if he wishes. Another option: have a PlayFromMark, with DictationMachine automatically inserting Marks. 5. Opening a Dictation Machine from a sound viewer and then clicking PlayFromSelection plays from the selection in the original viewer to its end -- it does not continue into the new sound viewer. It seems to know where a single selection is in some sound viewer, and clicking PlayFromSelection/ResumeFromSelection in any sound viewer plays/resumes from that single selection to the end of its viewer. Clicking ResumeFromEnd in some sound viewer resumes from the end of its own sound viewer only. 4. Trying to insert a temporary marker during playback is difficult, since the selection is being used to move the playback cue along. You are more likely to get the character that was selected before the playback operation was requested. Dan suggests that what you really want is to have one Mark operation insert a mark at the current playback spot, w/o any selecting. 3. The sound viewer frequently gets into a state where you have to close and reopen it in order to be able to select anything. Redraw works at least sometimes to get out of this state, also close and reopen. May 13, 1987 4:02:17 pm PDT Any Play to completion (rather than explicit STOP) triggers this state in released TV; in new TV, selection + Play to completion triggers it. Mostly fixed by not using the selection to change looks for playback feedback, but a few cases left. July 6, 1987 8:24:56 pm PDT ViewerForkersImpl.ForkPaint was sometimes coalescing two paints after the previous one had already started, so the final one didn't get done. May fix a long-standing typescript painting bug with similar symptoms (close & reopen renormalized the typescript). July 9, 1987 12:56:06 pm PDT BUT: Rick Beach claims it's not quite fixed yet.... 2. Where did Stephen put his new version when he was here in September? incorporated into DCS TV restructuring of April 87 1. Adding a textual marker refreshes the whole viewer after each character on the color display. For a long annotation, this can be very slow, unless you adjust the window smaller. On the bw display, it just blinks the display in a rather annoying fashion. June 5, 1987 11:03:45 am PDT VoiceMarkersImpl: This was apparently because of a bug that Mike Plass has fixed since Stephen was working on text markers -- PaintViewer was called for each character as a workaround. Removed those calls. 0b. August 21, 1986 6:11:39 pm PDT VoiceInTextImpl.AddVoiceMarkerAtPrimarySelection does not check for a point selection. BoundsFault. See #11, June 15, 1987 5:03:22 pm 0a. May 6, 1986 5:38:33 pm PDT Playing a tune that has silence at the beginning gets the moving feedback out of synch. <> 1. September 12, 1988 10:05:14 pm PDT Experimental change in voice playback cue implementation (VoiceViewersImpl); seemed slightly slower than looks method w/o selection. highlightProp: Rope.ROPE _ "0 0 0.25 textColor 0 0 0.6 backgroundColor the size 1 .sub backgroundAscent"; <> SetVoiceLooks: PUBLIC PROC [node: TiogaOpsDefs.Ref, start, len: INT, looks: Rope.ROPE] ~ { <> textNode: TextNode.Ref _ TiogaButtons.TextNodeRef[node]; charProp: Rope.ROPE _ IF Rope.IsEmpty[looks] THEN NIL ELSE highlightProp; DoIt: PROC [root: TiogaOpsDefs.Ref] ~ { <> FOR i: INT IN [0..len) DO TextEdit.PutCharProp[textNode, start+i, $Postfix, charProp] ENDLOOP; }; TiogaOps.CallWithLocks[DoIt, TiogaOps.Root[node]]; };