> For the complete documentation index, see [llms.txt](https://docs.apryse.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.apryse.com/uwp/changelogs/version-9/v9-1-2-78727.md).

# Version 9.1.2.78727 Changelog (December 14th, 2021)

World's #1 PDF SDK Library for Web, Mobile, Server, Desktop

Version: 9.1.2.78727

Release Date: December 14th, 2021

## Improvements

* \[tools] Updated WinUI 2.7 which gives a Windows 11 UX
* \[tools] Ink annotation will now be saved when Ink toolbar is closed
* \[tools] \[control] ViewerControl: Improved overall loading performance
* \[tools] \[control] ViewerControl: Improved responsiveness on touch device
* \[tools] \[control] ViewerControl: Added new shortcut to read aloud during text selection using Ctrl + R
* \[tools] \[control] ViewerControl: Updated all dialogs to use ContentDialog instead of MessageDialog
* \[tools] \[control] ThumbnailsView: Improved command bar UX by removing necessity of expading it to see button labels

## Bug Fixes

* \[tools] Fixes to address the possibility of runtime deadlocks
* \[tools] Minor localization improvements
* \[tools] \[control] ViewerControl: Fixed exception that could be raised when re-loading a page that has the ViewerControl
* \[tools] \[control] ViewerControl: Fixed flatten annotation action not firing document modified event
* \[tools] \[control] ViewerControl: Fixed overlapping of Flyout menus that could be opened at the same time (ViewModel, Viewer Secondary optins, Actions, etc)
* \[tools] \[control] ViewerControl: Fixed Add tab button not showing up in certain times
* \[tools] \[control] CreateDocControl: Fixed caching of the previous session by clearing fields to the default values
* \[tools] \[control] ContextMenu: Fixes for better handling the Show/Hide of the ContextMenu with different annotation tools
* \[tools] \[control] ContextMenu: Improved it's positioning on Show
* \[tools] \[control] Sound Annotation: Fixed playing audio recordings made in different viewers by properly wrapping to WAV format
* \[tools] \[control] Sound Annotation: better handling of the PDF page where audio annot has been requested to be inserted
* \[tools] \[control] Sound Annotation: Added Sound annotation to the Annotation List / side panel with audio duration in seconds

## New APIs - Tools Package SDK

*New* Methods

* `ViewerControl.CancelAnyOpenedContentDialog()`
* `static Windows.Foundation.AsyncStatus DialogHelper.GetDialogStatus()`
* `TabControlViewModel.CloseTabAsync()`
* `void ContextMenuControlViewModel.SetDimensions(double, double)`
* `static async Task<StorageFile> DocumentManager.SaveAudioWaveToDiskAsync(byte[])`
* `async Task TextSelect.HandleTextToSpeechAsync()`

*New* Properties

* `bool ViewerControl.HandleSystemBackButton`
* `bool ViewerControl.HandleViewerBackButton`
* `bool ViewerControl.IsExternalSaveEnabled`
* `bool ViewerControl.IsAnyContentDialogOpened`
* `bool ViewerControl.ShowTabFileInfo`
* `bool ViewerViewModel.HandleSystemBackButton`
* `bool ViewerViewModel.HandleViewerBackButton`
* `bool ViewerViewModel.IsExternalSaveEnabled`
* `bool ViewerViewModel.ShowTabFileInfo`
* `bool TabControlViewModel.ShowTabFileInfo`
* `bool CreateDocControlViewModel.IsCreateButtonEnabled`

*New* Events

* `ViewerControl.SaveRequested`
* `ViewerControl.SaveAsRequested`
* `ViewerControl.DocumentCreationFailed`
* `ViewerControl.NewDocumentCreated`
* `ViewerControl.ImageLoaded`
* `ViewerControl.ImageLoadingFailed`
* `ViewerControl.GoBackRequested`
* `ViewerViewModel.OnSoundAnnotRequested`
* `ViewerViewModel.DocumentCreationFailed`
* `ViewerViewModel.NewDocumentCreated`
* `ViewerViewModel.ImageLoaded`
* `ViewerViewModel.ImageLoadingFailed`
* `ViewerViewModel.SaveRequested`
* `ViewerViewModel.SaveAsRequested`
* `CreateDocControl.DocumentCreationFailed`
* `CreateDocControl.NewDocumentCreated`
* `CreateDocControl.DocumentCreationCancelled`
* `CreateDocControl.ImageLoaded`
* `CreateDocControl.ImageLoadingFailed`
* `CreateDocControlViewModel.DocumentCreationCancelled`
* `CreateDocControlViewModel.ImageLoaded`
* `CreateDocControlViewModel.ImageLoadingFailed`
* `PdfViewCtrlTabInfo.TabClosed`

*New* Enum WaveFormatEncoding

* `Unknown`
* `Pcm`
* `Adpcm`
* `IeeeFloat`
* `Vselp`
* `IbmCvsd`
* `ALaw`
* `MuLaw`
* `Dts`
* `Drm`
* `WmaVoice9`
* `OkiAdpcm`
* `DviAdpcm`
* `ImaAdpcm`
* `MediaspaceAdpcm`
* `SierraAdpcm`
* `G723Adpcm`
* `DigiStd`
* `DigiFix`
* `DialogicOkiAdpcm`
* `MediaVisionAdpcm`
* `CUCodec`
* `YamahaAdpcm`
* `SonarC`
* `DspGroupTrueSpeech`
* `EchoSpeechCorporation1`
* `AudioFileAf36`
* `Aptx`
* `AudioFileAf10`
* `Prosody1612`
* `Lrc`
* `DolbyAc2`
* `Gsm610`
* `MsnAudio`
* `AntexAdpcme`
* `ControlResVqlpc`
* `DigiReal`
* `DigiAdpcm`
* `ControlResCr10`
* `Extensible`
* `WAVE_FORMAT_DEVELOPMENT`

*New* Class WaveFormat

* *New* Constructors
  * `WaveFormat()`
  * `WaveFormat(int, int)`
  * `WaveFormat(int, int, int)`
  * `WaveFormat(BinaryReader)`
* *New* Properties
  * `WaveFormatEncoding Encoding`
  * `int Channels`
  * `int SampleRate`
  * `int AverageBytesPerSecond`
  * `virtual int BlockAlign`
  * `int BitsPerSample`
  * `int ExtraSize`
* *New* Methods
  * `int ConvertLatencyToByteSize(int)`
  * `static WaveFormat CreateCustomFormat(WaveFormatEncoding, int, int, int, int, int)`
  * `static WaveFormat CreateALawFormat(int, int)`
  * `static WaveFormat CreateMuLawFormat(int, int)`
  * `static WaveFormat CreateIeeeFloatWaveFormat(int, int)`
  * `static WaveFormat FromFormatChunk(BinaryReader, int)`
  * `virtual void Serialize(BinaryWriter)`

*New* Interface IWaveProvider

* *New* Properties
  * `WaveFormat WaveFormat`
* *New* Methods
  * `int Read(byte[], int, int)`

*New* abstract Class WaveStream

* *New* Properties
  * `abstract WaveFormat WaveFormat`
  * `virtual int BlockAlign`
  * `virtual TimeSpan CurrentTime`
  * `virtual TimeSpan TotalTime`
* *New* Methods
  * `void Skip(int)`
  * `virtual bool HasData(int)`

*New* Class RawSourceWaveStream

* *New* Constructors
  * `RawSourceWaveStream(Stream, WaveFormat)`
  * `RawSourceWaveStream(byte[], int, int, WaveFormat)`

*New* Class WaveFileWriterRT

* *New* Constructors
  * `public WaveFileWriterRT(Stream, WaveFormat)`
* *New* Properties
  * `string Filename`
  * `WaveFormat WaveFormat`
* *New* Methods
  * `static async Task<StorageFile> CreateWaveFileAsync(StorageFile, IWaveProvider)`
  * `void WriteSample(float)`
  * `void WriteSamples(float[], int, int)`
  * `void WriteSamples(short[], int, int)`

*New* Class WaveFormatExtraData

* *New* Constructors
  * `WaveFormatExtraData(BinaryReader)`
* *New* Properties
  * `byte[] ExtraData`


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.apryse.com/uwp/changelogs/version-9/v9-1-2-78727.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
