Memory usage by SpeechSynthesizer

175 Views Asked by At

I have writtten an application using SpeechSynthesizer which reads out text of a TextBox. In my ViewModel I have created a Single instance of that class and overridden Finalize method for disposal. When I paste some text in the TextBox and keep clicking on buttons I see the memory usage keeps increasing. In my application I have four buttons Play, Pause, Resume and Stop/Clear. In my ViewModel I have following Code

let ss = new SpeechSynthesizer()
let state = self.Factory.Backing( <@ self.State @>, ss.State)
let inputText = self.Factory.Backing(<@ self.InputText @>, "") 

let canPlay() = self.State <> SynthesizerState.Speaking && 
                self.State <> SynthesizerState.Paused && 
                not(String.IsNullOrWhiteSpace(self.InputText))

let canPause() = self.State = SynthesizerState.Speaking 
let canResume() = self.State = SynthesizerState.Paused 
let canStop() = not(String.IsNullOrWhiteSpace(self.InputText))

let play() = ss.SpeakAsync(self.InputText) |> ignore
             self.State <- SynthesizerState.Speaking 

let pause() = ss.Pause(); self.State <- SynthesizerState.Paused 
let resume() = ss.Resume(); self.State <- SynthesizerState.Speaking
let stop() = if ss.State = SynthesizerState.Paused then ss.Resume()   
             ss.SpeakAsyncCancelAll()
             self.State <- SynthesizerState.Ready 
             self.InputText <- "" 
do
    self.DependencyTracker.AddPropertyDependencies( <@ self.Play @>, [ <@@ self.InputText @@> ; <@@ self.State @@> ] )
    self.DependencyTracker.AddPropertyDependency( <@ self.Pause @>, <@ self.State @> )
    self.DependencyTracker.AddPropertyDependency( <@ self.Resume @>, <@ self.State @>  )
    self.DependencyTracker.AddPropertyDependency( <@ self.Stop @>, <@ self.InputText @> )

member self.InputText with get() = inputText.Value and set(v) = inputText.Value <- v 
member self.State with get() = state.Value and set(v) = state.Value <- v

member self.Play = self.Factory.CommandSyncChecked(play, canPlay)
member self.Pause = self.Factory.CommandSyncChecked(pause, canPause)
member self.Resume = self.Factory.CommandSyncChecked(resume, canResume)
member self.Stop = self.Factory.CommandSyncChecked(stop, canStop)

override self.Finalize() = ss.Dispose()

and in Xaml

<TextBox AcceptsReturn="True" TextWrapping="Wrap" 
             Text="{Binding InputText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"                 
             VerticalScrollBarVisibility="Auto"/>
<StackPanel Grid.Column="1" Margin="5">
        <Button Content="Play" Command="{Binding Play}" />
        <Button Content="Resume" Command="{Binding Resume}" Margin="0 5 0 0"/>
        <Button Content="Pause" Command="{Binding Pause}" Margin="0 5 0 0"/>
        <Button Content="Stop/Clear" Command="{Binding Stop}" Margin="0 5 0 0"/>
</StackPanel>

Is there anything wrong with my code?

0

There are 0 best solutions below