commit/StationPlaylist: 46 new changesets

  • From: commits-noreply@xxxxxxxxxxxxx
  • To: commits+int+220+6085746285340533186@xxxxxxxxxxxxxxxxxxxxx, nvda-addons-commits@xxxxxxxxxxxxx
  • Date: Sat, 20 Jan 2018 00:44:47 +0000 (UTC)

46 new commits in StationPlaylist:

https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/d45d36f17e7d/
Changeset:   d45d36f17e7d
Branch:      None
User:        josephsl
Date:        2017-12-03 21:01:24+00:00
Summary:     Extension points: rely solely on extension points for app module 
and certain dialogs.

Because NVDA 2017.4 or later is required, just use extension points directly 
instead of checkin for availability. This is now implemented in hte app module 
and certain dialogs.

Affected #:  3 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index c241184..d63eb2d 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -607,8 +607,7 @@ class AppModule(appModuleHandler.AppModule):
                except (IOError, AttributeError):
                        pass
                # #40 (17.12): react to profile switches.
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.register(self.actionProfileSwitched)
+               
splactions.SPLActionProfileSwitched.register(self.actionProfileSwitched)
                debugOutput("loading add-on settings")
                splconfig.initialize()
                # Announce status changes while using other programs.
@@ -927,9 +926,8 @@ class AppModule(appModuleHandler.AppModule):
                # #40 (17.12): replace this with a handler that responds to app 
module exit signal.
                # Also allows profile switch handler to unregister itself as 
well.
                # At the same time, close any opened SPL add-on dialogs.
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.unregister(self.actionProfileSwitched)
-                       splactions.SPLActionAppTerminating.notify()
+               
splactions.SPLActionProfileSwitched.unregister(self.actionProfileSwitched)
+               splactions.SPLActionAppTerminating.notify()
                debugOutput("closing microphone alarm/interval thread")
                global micAlarmT, micAlarmT2
                if micAlarmT is not None: micAlarmT.cancel()

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index c770d1c..1e396e8 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -32,7 +32,7 @@ class SPLConfigDialog(gui.SettingsDialog):
                SPLConfigHelper = gui.guiHelper.BoxSizerHelper(self, 
sizer=settingsSizer)
                # #40 (17.12): respond to app terminate notification by closing 
this dialog.
                # All top-level dialogs will be affected by this, and apart 
from this one, others will check for flags also.
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                # Broadcast profile controls were inspired by Config Profiles 
dialog in NVDA Core.
                # 7.0: Have a copy of the sorted profiles so the actual combo 
box items can show profile flags.
@@ -954,7 +954,7 @@ class AlarmsCenter(wx.Dialog):
                self.level = level
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                alarmsCenterHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                if level in (0, 1):
                        timeVal = parent.endOfTrackTime if level == 0 else 
splconfig.SPLConfig["IntroOutroAlarms"]["EndOfTrackTime"]
@@ -1120,7 +1120,7 @@ class MetadataStreamingDialog(wx.Dialog):
                self.func = func
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                metadataSizerHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                if func is None: labelText=_("Select the URL for metadata 
streaming upon request.")
                else: labelText=_("Check to enable metadata streaming, uncheck 
to disable.")

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 76be432..2c12cb1 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -88,7 +88,7 @@ class SPLFindDialog(wx.Dialog):
 
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                findSizerHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                findHistory = obj.appModule.findText if obj.appModule.findText 
is not None else []
                self.findEntry = findSizerHelper.addLabeledControl(findPrompt, 
wx.ComboBox, choices=findHistory)
@@ -167,7 +167,7 @@ class SPLTimeRangeDialog(wx.Dialog):
                self.func = func
 
                mainSizer = wx.BoxSizer(wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                minSizer = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, 
_("Minimum duration")), wx.HORIZONTAL)
                prompt = wx.StaticText(self, wx.ID_ANY, label=_("Minute"))
@@ -452,8 +452,7 @@ def 
metadata_actionProfileSwitched(configDialogActive=False):
        if splconfig.SPLConfig["General"]["MetadataReminder"] in ("startup", 
"instant"):
                _metadataAnnouncer(reminder=True)
 
-if splactions.actionsAvailable:
-       
splactions.SPLActionProfileSwitched.register(metadata_actionProfileSwitched)
+splactions.SPLActionProfileSwitched.register(metadata_actionProfileSwitched)
 
 # Microphone alarm checker.
 # Restart the microphone alarm timer if profile is switched and contains 
different mic alarm values.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/7b5607e9f61c/
Changeset:   7b5607e9f61c
Branch:      None
User:        josephsl
Date:        2017-12-04 05:40:43+00:00
Summary:     Global plugin: just use extension points directly.

Affected #:  1 file

diff --git a/addon/globalPlugins/splUtils/encoders.py 
b/addon/globalPlugins/splUtils/encoders.py
index 4dae605..129505b 100755
--- a/addon/globalPlugins/splUtils/encoders.py
+++ b/addon/globalPlugins/splUtils/encoders.py
@@ -171,7 +171,7 @@ class EncoderConfigDialog(wx.Dialog):
                EncoderConfigDialog._instance = weakref.ref(self)
                # And to close this automatically when Studio dies.
                from appModules.splstudio import splactions
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                self.obj = obj
                self.curStreamLabel, title = obj.getStreamLabel(getTitle=True)


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/cb6d9dd87832/
Changeset:   cb6d9dd87832
Branch:      None
User:        josephsl
Date:        2017-12-04 16:25:22+00:00
Summary:     Extension points: no more compatibility layer.

In case an action was part of a branch, just use extension points code from now 
on.

Affected #:  3 files

diff --git a/addon/appModules/splstudio/splactions.py 
b/addon/appModules/splstudio/splactions.py
index 65d36ff..c4480c5 100644
--- a/addon/appModules/splstudio/splactions.py
+++ b/addon/appModules/splstudio/splactions.py
@@ -12,21 +12,16 @@ import sys
 py3 = sys.version.startswith("3")
 
 # Do not unlock the full power of action extension point until 2018.
-try:
-       import extensionPoints
-       actionsAvailable = True
-except ImportError:
-       actionsAvailable = False
+import extensionPoints
 
 # 40 (17.12): unconditionally define actions, but not until 2018.
-if actionsAvailable:
-       # Studio handle found, app module is fully ready.
-       SPLActionAppReady = extensionPoints.Action()
-       # Add-on settings were loaded.
-       SPLActionSettingsLoaded = extensionPoints.Action()
-       # Switching broadcast profiles.
-       SPLActionProfileSwitched = extensionPoints.Action()
-       # Settings are being saved.
-       SPLActionSettingsSaved = extensionPoints.Action()
-       # Studio is terminating.
-       SPLActionAppTerminating = extensionPoints.Action()
+# Studio handle found, app module is fully ready.
+SPLActionAppReady = extensionPoints.Action()
+# Add-on settings were loaded.
+SPLActionSettingsLoaded = extensionPoints.Action()
+# Switching broadcast profiles.
+SPLActionProfileSwitched = extensionPoints.Action()
+# Settings are being saved.
+SPLActionSettingsSaved = extensionPoints.Action()
+# Studio is terminating.
+SPLActionAppTerminating = extensionPoints.Action()

diff --git a/addon/appModules/splstudio/splconfig.py 
b/addon/appModules/splstudio/splconfig.py
index b5c30bf..00b9b9d 100755
--- a/addon/appModules/splstudio/splconfig.py
+++ b/addon/appModules/splstudio/splconfig.py
@@ -493,11 +493,7 @@ class ConfigHub(ChainMap):
                # #38 (17.11/15.10-LTS): can't wait two seconds for microphone 
alarm to stop.
                # #40 (17.12): all taken care of by profile switched 
notification.
                _restartMicTimer()
-               if splactions.actionsAvailable: 
splactions.SPLActionProfileSwitched.notify()
-               else:
-                       # Use the module-level metadata and microphone status 
reminder methods if told to do so now.
-                       if self["General"]["MetadataReminder"] in ("startup", 
"instant"):
-                               _metadataAnnouncer(reminder=True)
+               splactions.SPLActionProfileSwitched.notify()
 
        # Used from config dialog and other places.
        # Show switch index is used when deleting profiles so it doesn't have 
to look up index for old profiles.

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index 1e396e8..f4bc4d2 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -327,13 +327,7 @@ class SPLConfigDialog(gui.SettingsDialog):
                # Change metadata streaming.
                # 17.11: call the metadata connector directly, reducing code 
duplication from previous releases.
                # 17.12: replaced by an action, with config UI active flag set.
-               import splmisc, splactions
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
-               else:
-                       
splmisc.metadataConnector(servers=splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"])
-                       # Also restart microphone timer.
-                       splmisc._restartMicTimer()
+               
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
 
        def onAppTerminate(self):
                # Call cancel function when the app terminates so the dialog 
can be closed.
@@ -461,12 +455,7 @@ class SPLConfigDialog(gui.SettingsDialog):
                        return
                splconfig.SPLConfig.deleteProfile(name)
                # 17.11: make sure to connect to the right set of metadata 
servers and enable/disable microphone alarm if appropriate.
-               import splmisc, splactions
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
-               else:
-                       
splmisc.metadataConnector(servers=splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"])
-                       splmisc._restartMicTimer()
+               
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
                if name == self.switchProfile or name == self.activeProfile:
                        # 17.11/15.10-LTS: go through the below path if and 
only if instant switch profile is gone.
                        if name == self.switchProfile:


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/d4a04a3b0169/
Changeset:   d4a04a3b0169
Branch:      None
User:        josephsl
Date:        2017-12-05 18:22:59+00:00
Summary:     Merge branch 'master' into extensionPointsR2

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splupdate.py 
b/addon/appModules/splstudio/splupdate.py
index 4af128a..6013673 100755
--- a/addon/appModules/splstudio/splupdate.py
+++ b/addon/appModules/splstudio/splupdate.py
@@ -87,7 +87,7 @@ def checkForAddonUpdate():
        updateURL = SPLUpdateURL if SPLUpdateChannel not in channels else 
channels[SPLUpdateChannel]
        # Skip ahead:
        import versionInfo
-       if (versionInfo.version_year, versionInfo.version_major) >= (2017, 4):
+       if SPLUpdateChannel == "try" and (versionInfo.version_year, 
versionInfo.version_major) >= (2017, 4):
                updateURL = 
"http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-tryahead";
        # Skip ahead end
        try:


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/c4c640e5ec7f/
Changeset:   c4c640e5ec7f
Branch:      None
User:        josephsl
Date:        2017-12-08 16:36:03+00:00
Summary:     Merge branch 'master' into extensionPointsR2

Affected #:  6 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index d63eb2d..895a13e 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -2217,6 +2217,7 @@ class AppModule(appModuleHandler.AppModule):
                "kb:e":"metadataStreamingAnnouncer",
                "kb:f1":"layerHelp",
                "kb:shift+f1":"openOnlineDoc",
+               "kb:control+shift+u":"updateCheck",
        }
 
        __SPLAssistantWEGestures={

diff --git a/addon/locale/de/LC_MESSAGES/nvda.po 
b/addon/locale/de/LC_MESSAGES/nvda.po
index eafe048..fabab1f 100644
--- a/addon/locale/de/LC_MESSAGES/nvda.po
+++ b/addon/locale/de/LC_MESSAGES/nvda.po
@@ -8,17 +8,28 @@ msgstr ""
 "Project-Id-Version: StationPlaylist 1.1-dev\n"
 "Report-Msgid-Bugs-To: nvda-translations@xxxxxxxxxxxxx\n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2017-07-27 11:30-0700\n"
-"Last-Translator: René Linke <rene.linke@xxxxxxxxxx>\n"
+"PO-Revision-Date: 2017-12-05 19:56+0100\n"
+"Last-Translator: Adriani Botez <adriani.botez@xxxxxxxxx>\n"
 "Language-Team: Deutsch <bernd_dorer@xxxxxxxx>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.9\n"
+"X-Generator: Poedit 1.5.7\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
+#. Translators: Presented when attempting to install Studio add-on on 
unsupported Windows releases.
+msgid ""
+"You are using an older version of Windows. This add-on requires Windows 7 "
+"Service Pack 1 or later."
+msgstr ""
+
+#. Translators: Title of a dialog shown when installing Studio add-on on old 
Windows releases.
+#, fuzzy
+msgid "Old Windows version"
+msgstr "Veraltete Windowsversion identifiziert"
+
 #, python-brace-format
 msgid "{header}: {content}"
 msgstr "{header}: {content}"
@@ -108,6 +119,10 @@ msgid ""
 "clipboard, and press three times to open a dialog to add, change or remove "
 "track comments"
 msgstr ""
+"Gibt Titelkommentare bekannt, falls vorhanden. Drücken Sie zweimal, um diese "
+"Informationen in die Zwischenablage zu kopieren, und drücken Sie dreimal, um "
+"einen Dialog zum Hinzufügen, Ändern oder Entfernen von Kommentaren "
+"anzuzeigen."
 
 #. Translators: Presented when no track status is found in Studio 5.10.
 msgid "Status not found"
@@ -119,7 +134,6 @@ msgid "Status: {name}"
 msgstr "Status: {name}"
 
 #. Translators: The text of the help command in SPL Assistant layer.
-#, fuzzy
 msgid ""
 "After entering SPL Assistant, press:\n"
 "A: Automation.\n"
@@ -156,12 +170,12 @@ msgid ""
 msgstr ""
 "Folgende Optionen stehen zur Verfügung:\n"
 "A: Automatisierung.\n"
-"c: Name des aktuell abgespielten Titels.\n"
-"D (r bei eingeschaltetem Kompatibilitätsmodus): Verbleibende Dauer der "
-"Wiedergabeliste.\n"
-"E: Overall metadata streaming status.\n"
-"1 through 4, 0: Metadata streaming status for DSP encoder and four "
-"additional URL's.\n"
+"c: Kartenexplorer ausklappen.\n"
+"Umschalt + c: Name des aktuell abgespielten Titels.\n"
+"D: Verbleibende Zeit für die Playlist.\n"
+"E: Streaming-Status der gesamten Metadaten.\n"
+"Umschalt + 1 bis Umschalt + 4, Umschalt + 0: Streaming-Status der Metadaten "
+"für den DSP-Encoder und für zusätzliche URLs.\n"
 "H: Spieldauer in dieser Sendestunde.\n"
 "Umschalt+H: Spieldauer der ausgewählten Titel.\n"
 "I (l bei eingeschaltetem Kompatibilitätsmodus): Anzahl der Zuhörer.\n"
@@ -175,18 +189,21 @@ msgstr ""
 "R (Umschalt+E bei eingeschaltetem Kompatibilitätsmodus): In Datei "
 "aufzeichnen.\n"
 "Umschalt+R: Scanvorgang der Bibliothek überwachen.\n"
-"S: Titelhäufigkeit.\n"
+"S: Voreingestellte Zeit für die Titelwiedergabe.\n"
+"Umschalt + S_ Zeit, bis der Titel abgespielt wird.\n"
 "T: Kartenbearbeitungsmodus.\n"
 "U: Studiolaufzeit.\n"
 "W: Wetter und Temperatur.\n"
 "Y: Änderungen der Wiedergabeliste.\n"
+"1 bis 0: Ansage der Spalten via Spaltenexplorer (0 ist der zehnte "
+"Spaltenslot).\n"
+"F8: Statistiken wie Titelanzahl, längster Titel usw. erstellen.\n"
 "F9: aktuellen Titel als Startzeitpunkt für die Zeitanalyse festlegen.\n"
 "F10: Zeitanalyse starten.\n"
-"F12: auf schnell zwischen Profilen umschalten.\n"
+"F12: Wechselt zu einem Instant-Switchh-Profil.\n"
 "Shift+F1: Benutzerhandbuch öffnen"
 
 #. Translators: The text of the help command in SPL Assistant layer when JFW 
layer is active.
-#, fuzzy
 msgid ""
 "After entering SPL Assistant, press:\n"
 "A: Automation.\n"
@@ -225,37 +242,40 @@ msgid ""
 msgstr ""
 "Folgende Optionen stehen zur Verfügung:\n"
 "A: Automatisierung.\n"
-"c: Name des aktuell abgespielten Titels.\n"
-"D (r bei eingeschaltetem Kompatibilitätsmodus): Verbleibende Dauer der "
-"Wiedergabeliste.\n"
-"E: Overall metadata streaming status.\n"
-"1 through 4, 0: Metadata streaming status for DSP encoder and four "
-"additional URL's.\n"
+"c: Kartenexplorer ausklappen.\n"
+"Umschalt + c: Name des aktuell abgespielten Titels.\n"
+"E: Streaming-Status der gesamten Metadaten.\n"
+"Umschalt + 1 bis Umschalt + 4, Umschalt + 0: Streaming-Status der Metadaten "
+"für den DSP-Encoder und für zusätzliche URLs.\n"
+"Umschalt+E: In Datei aufzeichnen.\n"
+"F: Titelfinder.\n"
 "H: Spieldauer in dieser Sendestunde.\n"
 "Umschalt+H: Spieldauer der ausgewählten Titel.\n"
-"I (l bei eingeschaltetem Kompatibilitätsmodus): Anzahl der Zuhörer.\n"
 "K: zum Lesezeichen bewegen\n"
 "strg+K: Lesezeichen setzen\n"
-"L (Umschalt+l bei eingeschaltetem Kompatibilitätsmodus): Line-In-Status.\n"
+"L: Anzahl der Zuhörer.\n"
+"Umschalt+l: Line-In-Status.\n"
 "M: Mikrofon-Status.\n"
 "N: Nächsten Titel.\n"
 "P: Wiedergabe-Status.\n"
 "Umschalt+P: Tonhöhe des aktuellen Titels.\n"
-"R (Umschalt+E bei eingeschaltetem Kompatibilitätsmodus): In Datei "
-"aufzeichnen.\n"
+"R: Verbleibende Zeit für die Playlist.\n"
 "Umschalt+R: Scanvorgang der Bibliothek überwachen.\n"
-"S: Titelhäufigkeit.\n"
+"S: Voreingestellte Zeit für die Titelwiedergabe.\n"
+"Umschalt + S_ Zeit, bis der Titel abgespielt wird.\n"
 "T: Kartenbearbeitungsmodus.\n"
 "U: Studiolaufzeit.\n"
 "W: Wetter und Temperatur.\n"
 "Y: Änderungen der Wiedergabeliste.\n"
+"1 bis 0: Ansage der Spalten via Spaltenexplorer (0 ist der zehnte "
+"Spaltenslot).\n"
+"F8: Statistiken wie Titelanzahl, längster Titel usw. erstellen.\n"
 "F9: aktuellen Titel als Startzeitpunkt für die Zeitanalyse festlegen.\n"
 "F10: Zeitanalyse starten.\n"
-"F12: auf schnell zwischen Profilen umschalten.\n"
+"F12: Wechselt zu einem Instant-Switchh-Profil.\n"
 "Shift+F1: Benutzerhandbuch öffnen"
 
 #. Translators: The text of the help command in SPL Assistant layer when 
Window-Eyes layer is active.
-#, fuzzy
 msgid ""
 "After entering SPL Assistant, press:\n"
 "A: Automation.\n"
@@ -296,33 +316,39 @@ msgid ""
 msgstr ""
 "Folgende Optionen stehen zur Verfügung:\n"
 "A: Automatisierung.\n"
-"c: Name des aktuell abgespielten Titels.\n"
-"D (r bei eingeschaltetem Kompatibilitätsmodus): Verbleibende Dauer der "
-"Wiedergabeliste.\n"
-"E: Overall metadata streaming status.\n"
-"1 through 4, 0: Metadata streaming status for DSP encoder and four "
-"additional URL's.\n"
+"c: Kartenexplorer ausklappen.\n"
+"Umschalt + c: Name des aktuell abgespielten Titels.\n"
+"D: Verbleibende Zeit für die Playlist.\n"
+"E: Verstrichene Zeit.\n"
+"F: Titelfinder.\n"
+"R: Verbleibende zeit des aktuellen Titels.\n"
+"G: Streaming-Status der gesamten Metadaten.\n"
+"Umschalt + 1 bis Umschalt + 4, Umschalt + 0: Streaming-Status der Metadaten "
+"für den DSP-Encoder und für zusätzliche URLs.\n"
 "H: Spieldauer in dieser Sendestunde.\n"
 "Umschalt+H: Spieldauer der ausgewählten Titel.\n"
-"I (l bei eingeschaltetem Kompatibilitätsmodus): Anzahl der Zuhörer.\n"
 "K: zum Lesezeichen bewegen\n"
 "strg+K: Lesezeichen setzen\n"
-"L (Umschalt+l bei eingeschaltetem Kompatibilitätsmodus): Line-In-Status.\n"
+"L: Anzahl der Zuhörer.\n"
+"Umschalt + L: Line-In-Status.\n"
 "M: Mikrofon-Status.\n"
 "N: Nächsten Titel.\n"
 "P: Wiedergabe-Status.\n"
 "Umschalt+P: Tonhöhe des aktuellen Titels.\n"
-"R (Umschalt+E bei eingeschaltetem Kompatibilitätsmodus): In Datei "
-"aufzeichnen.\n"
+"Umschalt+E: In Datei aufzeichnen.\n"
 "Umschalt+R: Scanvorgang der Bibliothek überwachen.\n"
-"S: Titelhäufigkeit.\n"
+"S: Voreingestellte Zeit für die Titelwiedergabe.\n"
+"Umschalt + S_ Zeit, bis der Titel abgespielt wird.\n"
 "T: Kartenbearbeitungsmodus.\n"
 "U: Studiolaufzeit.\n"
 "W: Wetter und Temperatur.\n"
 "Y: Änderungen der Wiedergabeliste.\n"
+"1 bis 0: Ansage der Spalten via Spaltenexplorer (0 ist der zehnte "
+"Spaltenslot).\n"
+"F8: Statistiken wie Titelanzahl, längster Titel usw. erstellen.\n"
 "F9: aktuellen Titel als Startzeitpunkt für die Zeitanalyse festlegen.\n"
 "F10: Zeitanalyse starten.\n"
-"F12: auf schnell zwischen Profilen umschalten.\n"
+"F12: Wechselt zu einem Instant-Switchh-Profil.\n"
 "Shift+F1: Benutzerhandbuch öffnen"
 
 #. Translators: Script category for Station Playlist commands in input 
gestures dialog.
@@ -384,6 +410,8 @@ msgid ""
 "Announces broadcaster time. If pressed twice, reports minutes and seconds "
 "left to top of the hour."
 msgstr ""
+"Zeigt die Sendezeit an. Bei zweimaligem Drücken werden die Minuten und "
+"Sekunden bis zur vollen Stunde angezeigt."
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
 msgid "Announces time including seconds."
@@ -402,17 +430,16 @@ msgid "Error"
 msgstr "Fehler"
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
-#, fuzzy
 msgid "Sets end of track alarm (default is 5 seconds)."
 msgstr ""
 "Stellt die Zeitspanne für die Benachrichtigung zum Ende eines Titels ein "
 "(Standard sind 5 Sekunden)"
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
-#, fuzzy
 msgid "Sets song intro alarm (default is 5 seconds)."
 msgstr ""
-"Benachrichtigung bei Song-Einleitung festlegen (Standard sind 5 Sekunden)."
+"Stellt eine Zeitspanne für die Benachrichtigung zum Song-Beginn ein "
+"(Standard sind 5 Sekunden)."
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
 msgid "Sets microphone alarm (default is 5 seconds)."
@@ -482,9 +509,9 @@ msgid "Finds previous occurrence of the track with the name 
in the track list."
 msgstr "Sucht nach dem vorherigen gefundenen Titel in der Titelliste."
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
-#, fuzzy
 msgid "Locates track with duration within a time range"
-msgstr "Sucht nach Titel mit einer definierten Länge"
+msgstr ""
+"Sucht nach Titel mit einer definierten Dauer in einem bestimmten Zeitfenster"
 
 #. Translators: Presented when cart explorer cannot be entered.
 msgid "You are not in playlist viewer, cannot enter cart explorer"
@@ -565,7 +592,6 @@ msgstr ""
 "Öffnet einen Dialog, zum schnellen (de)aktivieren von Metadaten-Streaming."
 
 #. Translators: Presented when track time analysis and/or playlist snapshot 
gathering cannot be performed because user is not focused on playlist viewer.
-#, fuzzy
 msgid ""
 "Not in playlist viewer, cannot perform track time analysis or gather "
 "playlist snapshot statistics."
@@ -584,9 +610,9 @@ msgid "Tracks: {playlistTrackCount}"
 msgstr "Tracks: {playlistTrackCount}"
 
 #. Translators: one of the results for playlist snapshots feature for 
announcing total duration of a playlist.
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Duration: {playlistTotalDuration}"
-msgstr "Station Playlist Studio"
+msgstr "Dauer: {playlistTotalDuration}"
 
 #. Translators: one of the results for playlist snapshots feature for 
announcing shortest track name and duration of a playlist.
 #, python-brace-format
@@ -609,9 +635,8 @@ msgid "Top artist: %s (%s)"
 msgstr "Top Künstler: %s (%s)"
 
 #. Translators: one of the results for playlist snapshots feature, a heading 
for a group of items.
-#, fuzzy
 msgid "Top artists:"
-msgstr "Kein Künstler"
+msgstr "Top Künstler"
 
 #, python-brace-format
 msgid "No artist information ({artistCount})"
@@ -654,11 +679,13 @@ msgstr "{genreName} ({genreCount})"
 #. Translators: The title of a window for displaying playlist snapshots 
information.
 #. Translators: Title of a dialog to configure playlist snapshot information.
 msgid "Playlist snapshots"
-msgstr ""
+msgstr "laylist-Statistiken"
 
 #. Translators: Presented when SPL Assistant cannot be invoked.
 msgid "Failed to locate Studio main window, cannot enter SPL Assistant"
 msgstr ""
+"Studio-Hauptfenster konnte nicht gefunden werden, kann nicht in den SPL-"
+"Assistenten gelangen."
 
 #. Translators: Input help mode message for a layer command in Station 
Playlist Studio.
 msgid ""
@@ -670,7 +697,7 @@ msgstr ""
 
 #. Translators: reported when no playlist has been loaded when trying to 
obtain remaining time for a playlist.
 msgid "No playlist has been loaded."
-msgstr ""
+msgstr "Es wurde keine Playlist geladen."
 
 #. Translators: Presented when playlist modification is unavailable (for 
Studio 4.33 and earlier)
 msgid "Playlist modification not available"
@@ -701,9 +728,8 @@ msgstr ""
 "Es konnten keine informationen über den aktuellen Titel abgerufen werden."
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
-#, fuzzy
 msgid "Announces title of the currently playing track"
-msgstr "&Namen der aktuell abgespielten Karte ausgeben"
+msgstr "Sagt den Namen des aktuell abgespielten Titels an"
 
 #. Translators: Presented when there is no weather or temperature information.
 msgid "Weather and temperature not configured"
@@ -734,18 +760,16 @@ msgid "Scanning is in progress"
 msgstr "Der Scanvorgang läuft im Moment."
 
 #. Translators: reported when no playlist has been loaded when trying to 
perform track time analysis.
-#, fuzzy
 msgid "No playlist has been loaded, cannot perform track time analysis."
 msgstr ""
-"Die Zeitanalyse kann nicht durchgeführt werden, weil Sie noch keine Titel "
-"hinzugefügt haben."
+"Die Zeitanalyse kann nicht durchgeführt werden, weil noch keine Playlist "
+"geladen ist."
 
 #. Translators: Presented when track time analysis cannot be activated.
-#, fuzzy
 msgid "No tracks are selected, cannot perform track time analysis."
 msgstr ""
 "Die Zeitanalyse kann nicht durchgeführt werden, weil Sie noch keine Titel "
-"hinzugefügt haben."
+"ausgewählt haben."
 
 #. Translators: Presented when track time analysis is turned on.
 msgid "Track time analysis activated"
@@ -785,13 +809,14 @@ msgstr ""
 "dem aktuellen Titel an."
 
 msgid "You need to add tracks before invoking this command"
-msgstr ""
+msgstr "Sie müssen Titel hinzufügen, bevor Sie diesen Befehl ausführen."
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
 msgid ""
 "Presents playlist snapshot information such as number of tracks and top "
 "artists"
 msgstr ""
+"Zeigt Playlist-Statistiken, wie z.B. die Anzahl der Titel und Top künstler."
 
 #. Translators: Presented when place marker cannot be set.
 msgid "No tracks found, cannot set place marker"
@@ -808,6 +833,8 @@ msgstr "Dieser Titel kann nicht als Markierung verwendet 
werden."
 #. Translators: Presented when attempting to move to a place marker track when 
not focused in playlist viewer.
 msgid "You cannot move to a place marker track outside of playlist viewer."
 msgstr ""
+"Außerhalb des Playlist-Viewers können Sie nicht zu einem Lesezeichen "
+"wechseln."
 
 #. Translators: Presented when no place marker is found.
 msgid "No place marker found"
@@ -840,14 +867,12 @@ msgid "SPL Assistant help"
 msgstr "SPL-Hilfe"
 
 #. Translators: The title for SPL Assistant help dialog.
-#, fuzzy
 msgid "SPL Assistant help for JAWS layout"
-msgstr "SPL-Hilfe"
+msgstr "SPL-Hilfe für Jaws-Darstellung"
 
 #. Translators: The title for SPL Assistant help dialog.
-#, fuzzy
 msgid "SPL Assistant help for Window-Eyes layout"
-msgstr "SPL-Hilfe"
+msgstr "SPL-Hilfe für Window-Eyes-Darstellung"
 
 #. Translators: The title of the dialog presented while checking for add-on 
updates.
 msgid "Add-on update check"
@@ -868,14 +893,14 @@ msgstr ""
 "zwischen Profilen umgeschaltet werden."
 
 #. Translators: Presented when switch to instant switch profile was successful.
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Switching to {newProfileName}"
-msgstr "Profile werden umgeschaltet."
+msgstr "Wechselt zum {newProfileName}"
 
 #. Translators: Presented when switching from instant switch profile to a 
previous profile.
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Returning to {previousProfile}"
-msgstr "Rückkehr zum vorherigen Profil"
+msgstr "Kehrt zum {previousProfile} zurück"
 
 #. Translators: Standard error title for configuration error.
 msgid "Studio add-on Configuration error"
@@ -886,6 +911,9 @@ msgid ""
 "Your encoder settings had errors and were reset to defaults. If you have "
 "stream labels configured for various encoders, please add them again."
 msgstr ""
+"Ihre Encoder-Einstellungen waren fehlerhaft und wurden auf die "
+"Standardeinstellungen zurückgesetzt. Wenn Sie Streambezeichnungen für "
+"verschiedene Encoder konfiguriert haben, fügen Sie diese bitte erneut hinzu."
 
 #. Translators: Title of the encoder settings error dialog.
 msgid "Encoder settings error"
@@ -910,9 +938,8 @@ msgstr "aktiv"
 
 #. Translators: A flag indicating the broadcast profile is an instant switch 
profile.
 #. Instant switch flag is set on another profile, so remove the flag first.
-#, fuzzy
 msgid "instant switch"
-msgstr "Schnelle Umschaltung zwischen Profilen aktivierten"
+msgstr "instant switch"
 
 #. Translators: A flag indicating the time-based triggers profile.
 #. Calling set profile flags with discard argument is always safe here.
@@ -920,14 +947,12 @@ msgid "time-based"
 msgstr "Zeit-basiert"
 
 #. Translators: announced when only normal profile is in use.
-#, fuzzy
 msgid "Only normal profile is in use"
-msgstr "Normales profil"
+msgstr "Nur das normale Profil ist gerade aktiv"
 
 #. Translators: Presented when trying to switch to an instant switch profile 
when the instant switch profile is not defined.
-#, fuzzy
 msgid "No instant switch profile is defined"
-msgstr "kein Schnellprofil definiert."
+msgstr "kein Instant-Switch-Profil definiert."
 
 #. Translators: Presented when trying to switch to an instant switch profile 
when one is already using the instant switch profile.
 msgid "You are already in the instant switch profile"
@@ -938,9 +963,8 @@ msgid "A profile trigger is already active"
 msgstr "Ein Profil-Auslöser ist bereits aktiv"
 
 #. Translators: Title of a dialog displayed when the add-on starts reminding 
broadcasters to disable audio ducking.
-#, fuzzy
 msgid "SPL Studio and audio ducking"
-msgstr "SPL-Studio läuft gerade nicht."
+msgstr "SPL-Studio und Audio ducking."
 
 #. Translators: A message displayed if audio ducking should be disabled.
 msgid ""
@@ -952,9 +976,17 @@ msgid ""
 "audio ducking mode combo box.\n"
 "\t\t* Press NVDA+Shift+D to set it to 'no ducking'."
 msgstr ""
+"NVDA 2016.1 und höher ermöglicht es NVDA, die Lautstärke der "
+"Hintergrundsounds zu verringern, einschließlich der Lautstärke von Studio.\n"
+"\t\tUm das Hörerlebnis Ihrer Zuhörer nicht zu stören, deaktivieren Sie bitte "
+"das Audio-Ducking entweder durch:\n"
+"\t\t* Öffnen des Sprachausgabendialogs in NVDA und Auswählen von\"Lautstärke "
+"anderer Audioquellen reduzieren: nie\" aus der entsprechenden "
+"Ausklappliste.\n"
+"\t\t* Drücken Sie NVDA+Umschalt+D, um die Verringerung der Lautstärke auf"
+"\"nie\" zu stellen."
 
 #. Translators: A checkbox to turn off audio ducking reminder message.
-#. Translators: A checkbox to turn off old version reminder message.
 msgid "Do not show this message again"
 msgstr "Zeige iese Meldung nicht mehr"
 
@@ -985,27 +1017,38 @@ msgid ""
 "\n"
 "Thank you."
 msgstr ""
+"Willkommen zur StationPlaylist-Studio-Erweiterung für NVDA,\n"
+"Ihr Begleiter bei der Übertragung mit SPL Studio mit NVDA Screenreader.\n"
+"\n"
+"Zu den Highlights dieser Erweiterung gehören:\n"
+"* Tastatur-Befehle zum Abrufen von Statusinformationen.\n"
+"* Verschiedene Möglichkeiten, Titelspalten zu analysieren.\n"
+"* Verschiedene Wege, Titel zu finden.\n"
+"* Kartenexplorer, um die Zuordnung von Karten zu lernen.\n"
+"* Umfassende Einstellungen und Dokumentation.\n"
+"* Automatische oder manuelle Suche nach Aktualisierungen.\n"
+"* Komplett kostenlos, open-source und weiterentwickelt durch die Community.\n"
+"* Und noch viel mehr.\n"
+"\n"
+"Besuchen Sie www.stationplaylist.com für weitere Informationen über "
+"StationPlaylist Studio.Besuchen Sie den StationPlaylist Eintrag auf der "
+"Seite der NVDA-Erweiterungen (addons.nvda-project.org) für weitere "
+"Informationen über die Erweiterung und um die Dokumentation zu lesen.Möchten "
+"Sie diesen Dialog noch einmal sehen? Drücken Sie einfach Alt+NVDA+F1, "
+"während Sie Studio verwenden, um zu diesem Dialog zurückzukehren.Haben Sie "
+"etwas über die Erweiterung zu sagen? Drücken Sie Control+NVDA+Bindestrich "
+"(-), um über Ihr Mailprogramm Feedback an den Entwickler dieser Erweiterung "
+"zu senden.\n"
+"\n"
+"Ich danke Ihnen."
 
 #. Translators: Title of a dialog displayed when the add-on starts presenting 
basic information, similar to NVDA's own welcome dialog.
-#, fuzzy
 msgid "Welcome to StationPlaylist Studio add-on"
-msgstr "Station Playlist Studio (SPL)"
+msgstr "Wollkommen zur Erweiterung für das Station Playlist Studio (SPL)"
 
 #. Translators: A checkbox to show welcome dialog.
 msgid "Show welcome dialog when I start Studio"
-msgstr ""
-
-#. Translators: Title of a dialog displayed when the add-on starts reminding 
broadcasters about old Studio releases.
-msgid "Old Windows version detected"
-msgstr ""
-
-#. Translators: A message displayed if using an old Studio or Windows version.
-msgid ""
-"You are using an older version of Windows. From 2018 onwards, Studio add-on "
-"will not support versions earlier than Windows 7 Service Pack 1. Add-on 15.x "
-"LTS (long-term support) versions will support Windows versions such as "
-"Windows XP until mid-2018."
-msgstr ""
+msgstr "Zeige Willkommensdialog beim Starten der Studio-Erweiterung"
 
 #. Translators: Reported when status announcement is set to beeps in SPL 
Studio.
 msgid "Status announcement beeps"
@@ -1115,16 +1158,15 @@ msgstr "&Auslöser..."
 
 #. Translators: The label for a setting in SPL Add-on settings to configure 
countdown seconds before switching profiles.
 msgid "Countdown seconds before switching profiles"
-msgstr ""
+msgstr "Zählt die Sekunden bis zum Profilwechsel ab"
 
 #. Translators: The label of a button to open a dialog to configure general 
add-on settings such as beep announcement and top and bottom notifications.
-#, fuzzy
 msgid "&General add-on settings..."
-msgstr "Einstellungen zurücksetzen"
+msgstr "&Allgemeine Einstellungen..."
 
 #. Translators: The label of a button to open a dialog to configure various 
alarms.
 msgid "&Alarms Center..."
-msgstr ""
+msgstr "&Benachrichtigungscenter..."
 
 #. Translators: One of the alarm notification options.
 msgid "beep"
@@ -1144,7 +1186,7 @@ msgstr "&Alarmmeldung:"
 
 #. Translators: The label of a button to manage playlist snapshot flags.
 msgid "&Playlist snapshots..."
-msgstr ""
+msgstr "&Playlist-Statistiken"
 
 #. Translators: One of the metadata notification settings.
 msgid "When Studio starts"
@@ -1173,21 +1215,20 @@ msgstr "&Meldungen für Spalten von Titeln verwalten"
 #. Translators: the label for a setting in SPL add-on settings to toggle 
whether column headers should be included when announcing track information.
 msgid "Include column &headers when announcing track information"
 msgstr ""
+"Spalten- und Kopfzeilen bei der Ankündigung von Titelinformationen "
+"einbeziehen"
 
 #. Translators: The label of a button to configure columns explorer slots (SPL 
Assistant, number row keys to announce specific columns).
-#, fuzzy
 msgid "Columns E&xplorer..."
-msgstr "Reihenfolge der Spalten:"
+msgstr "Spaltene&xplorer..."
 
 #. Translators: The label of a button to configure columns explorer slots for 
Track Tool (SPL Assistant, number row keys to announce specific columns).
-#, fuzzy
 msgid "Columns Explorer for &Track Tool..."
-msgstr "Reihenfolge der Spalten:"
+msgstr "Spaltenexplorer für &Titelwerkzeug..."
 
 #. Translators: The label of a button to open status announcement dialog such 
as announcing listener count.
-#, fuzzy
 msgid "&Status announcements..."
-msgstr "Pieptöne bei Statusansage"
+msgstr "&Statusansagen..."
 
 #. Translators: The label of a button to open advanced options such as using 
SPL Controller command to invoke Assistant layer.
 msgid "&Advanced options..."
@@ -1203,6 +1244,10 @@ msgid ""
 "change to take effect. Be sure to answer yes when you are asked to install "
 "the new version when prompted after restarting NVDA."
 msgstr ""
+"Sie haben den Aktualisierungskanal für diese Erweiterung geändert. Sie "
+"müssen NVDA neu starten, damit die Änderung wirksam wird. Wenn Sie nach dem "
+"Neustart von NVDA aufgefordert werden, die neue Version zu installieren, "
+"müssen Sie mit Ja antworten."
 
 #. Translators: Title of the update channel dialog.
 msgid "Add-on update channel changed"
@@ -1229,6 +1274,10 @@ msgid ""
 "broadcast. If so, please press SPL Assistant, F12 to switch back to a "
 "previously active profile before opening add-on settings to delete a profile."
 msgstr ""
+"Ein Instant-Switch-Profil könnte aktiv sein oder Sie befinden sich mitten in "
+"einer Sendung. Wenn es so ist, drücken Sie bitte SPL Assistant, F12, um zu "
+"einem zuvor aktiven Profil zurückzukehren, bevor Sie die "
+"Erweiterungseinstellungen öffnen, um ein Profil zu löschen."
 
 #. Translators: Title of a dialog shown when profile cannot be deleted.
 msgid "Profile delete error"
@@ -1239,11 +1288,12 @@ msgid ""
 "You are about to delete the currently active profile. Select yes if you wish "
 "to proceed."
 msgstr ""
+"Sie sind dabei, das gerade aktive Profil zu löschen. Wählen Sie Ja, wenn Sie "
+"fortfahren möchten."
 
 #. Translators: The title of the confirmation dialog for deletion of a profile.
-#, fuzzy
 msgid "Delete active profile"
-msgstr "Zeitbasierte Profile fehlen"
+msgstr "Aktives Profil löschen..."
 
 #. Translators: The confirmation prompt displayed when the user requests to 
delete a broadcast profile.
 msgid "Are you sure you want to delete this profile? This cannot be undone."
@@ -1256,7 +1306,6 @@ msgid "Confirm Deletion"
 msgstr "Löschen bestätigen"
 
 #. Translators: Presented when an alarm dialog is opened.
-#, fuzzy
 msgid ""
 "Another add-on settings dialog is open. Please close the previously opened "
 "dialog first."
@@ -1286,13 +1335,12 @@ msgid "Profile triggers for {profileName}"
 msgstr "Profil-Auslöser für {profileName}"
 
 #. Translators: The label of a checkbox to toggle if selected profile is an 
instant switch profile.
-#, fuzzy
 msgid "This is an &instant switch profile"
-msgstr "Wenn das Schnellprofil aktiv ist"
+msgstr "Dies ist ein &Instant-Switch-Profil"
 
 #. Translators: The label of a checkbox to toggle if selected profile is a 
time-based profile.
 msgid "This is a &time-based switch profile"
-msgstr ""
+msgstr "Dies ist ein &zeitbasiertes Schaltprofil"
 
 msgid "Day"
 msgstr "Tag"
@@ -1310,23 +1358,25 @@ msgid "Duration in minutes"
 msgstr "Dauer in Minuten"
 
 #. Translators: Presented if another profile occupies a time slot set by the 
user.
-#, fuzzy
 msgid ""
 "A profile trigger already exists for the entered time slot. Please choose a "
 "different date or time."
 msgstr ""
-"Dieses Profil existiert bereits. Bitte wählen Sie einen anderen Namen aus."
+"Ein Profilauslöser für den eingegebenen Zeitbereich existiert bereits. Bitte "
+"wählen Sie ein anderes Datum und eine andere uhrzeit aus."
 
 #. Er, did you specify a date?
 msgid ""
 "The time-based profile checkbox is checked but no switch dates are given. "
 "Please either specify switch date(s) or uncheck time-based profile checkbox."
 msgstr ""
+"Das Kontrollfeld zeitbasiertes profil ist markiert, es werden jedoch keine "
+"Schaltdaten angegeben. Bitte geben Sie entweder das/die Schaltdatum(e) an "
+"oder deaktivieren Sie das Kontrollkästchen zeitbasiertes Profil."
 
 #. Translators: Title of a dialog to configure various status announcements 
such as announcing listener count.
-#, fuzzy
 msgid "General add-on settings"
-msgstr "Einstellungen zur Studio-Erweiterung"
+msgstr "Allgemeine Einstellungen für die Studio-Erweiterung"
 
 #. Translators: the label for a setting in SPL add-on settings to set status 
announcement between words and beeps.
 msgid "&Beep for status announcements"
@@ -1366,42 +1416,41 @@ msgstr "&Meldung beim Durchsuchen der Bibliothek"
 
 #. Translators: the label for a setting in SPL add-on settings to announce 
time including hours.
 msgid "Include &hours when announcing track or playlist duration"
-msgstr ""
+msgstr "Stunden bei der &Ansage der Titel- und Playlistdauer mit einbeziehen"
 
 #. Translators: The label for a setting in SPL add-on dialog to set vertical 
column.
-#, fuzzy
 msgid "&Vertical column navigation announcement:"
-msgstr "&Meldung beim Durchsuchen der Bibliothek"
+msgstr "&Ansage der vertikalen Spaltennavigation:"
 
 #. Translators: One of the options for vertical column navigation denoting 
NVDA will announce current column positoin (e.g. second column position from 
the left).
 msgid "whichever column I am reviewing"
-msgstr ""
+msgstr "Egal in welcher Spalte ich mich befinde"
 
 #. Translators: the label for a setting in SPL add-on settings to toggle 
category sound announcement.
 msgid "&Beep for different track categories"
-msgstr ""
+msgstr "&Piepton für verschiedene Titelkathegorien"
 
 #. Translators: One of the track comment notification settings.
-#, fuzzy
 msgid "Message"
-msgstr "meldungen"
+msgstr "meldung"
 
 #. Translators: One of the track comment notification settings.
 msgid "Beep"
 msgstr "Signalton"
 
 #. Translators: the label for a setting in SPL add-on settings to set how 
track comments are announced.
-#, fuzzy
 msgid "&Track comment announcement:"
-msgstr "&Meldung beim Durchsuchen der Bibliothek"
+msgstr "&Ansage des Kommentars für den Musiktitel"
 
 #. Translators: the label for a setting in SPL add-on settings to toggle top 
and bottom notification.
 msgid "Notify when located at &top or bottom of playlist viewer"
 msgstr ""
+"Benachrichtigen, wenn der Cursor im oberen oder unteren Bereich des Playlist-"
+"Viewers angekommen ist."
 
 #. Translators: the label for a setting in SPL add-on settings to enable 
requests alert.
 msgid "Play a sound when listener &requests arrive"
-msgstr ""
+msgstr "Spielen Sie einen Sound ab, wenn der Zuhörer &Eintritt anfordert."
 
 #. Translators: Text of the dialog when another alarm dialog is open.
 msgid "Another alarm dialog is open."
@@ -1410,7 +1459,7 @@ msgstr "Ein anderer Benachrichtigungsdialog ist offen."
 #. Now the actual alarm dialog code.
 #. 8.0: Apart from level 0 (all settings shown), levels change title.
 msgid "Alarms Center"
-msgstr ""
+msgstr "Benachrichtigungscenter"
 
 msgid "End of track alarm"
 msgstr "Benachrichtigung bei Titelende"
@@ -1434,11 +1483,10 @@ msgid "&Notify when end of introduction is approaching"
 msgstr "&Benachrichtigen sobald das Ende der Einleitung erreicht wird"
 
 #. Translators: A dialog message to set microphone active alarm.
-#, fuzzy
 msgid "&Microphone alarm in seconds (0 disables the alarm)"
 msgstr ""
-"Zeitspanne des Mikrofon-Alarms in Sekunden eingeben (zur Zeit ausgeschaltet; "
-"mit 0 können Sie den Alarm ausschalten)"
+"&Zeitspanne des Mikrofon-Alarms in Sekunden (mit 0 können Sie den Alarm "
+"ausschalten)"
 
 msgid "Microphone alarm &interval in seconds"
 msgstr "Intervall für &Mikrofon-Alarm in Sekunden"
@@ -1448,15 +1496,17 @@ msgid ""
 "Select information to be included when obtaining playlist snapshots.\n"
 "\t\tTrack count and total duration are always included."
 msgstr ""
+"Whälen Sie die Informationen aus, die bei der Erstellung ovn Playlist-"
+"Statistiken berücksichtigt werden sollen.\n"
+"\t\tAnzahl der Titel und Gesamtdauer sind standardmäßig eingeschlossen."
 
 #. Translators: the label for a setting in SPL add-on settings to include 
shortest and longest track duration in playlist snapshots window.
 msgid "Shortest and longest tracks"
 msgstr "kürzester und längster Titel"
 
 #. Translators: the label for a setting in SPL add-on settings to include 
average track duration in playlist snapshots window.
-#, fuzzy
 msgid "Average track duration"
-msgstr "Ende der Titel in Braille"
+msgstr "Durchschnittsdauer der Titel"
 
 #. Translators: the label for a setting in SPL add-on settings to include 
track artist count in playlist snapshots window.
 msgid "Artist count"
@@ -1473,9 +1523,8 @@ msgid "Top category count (0 displays all categories)"
 msgstr "Anzahl der Top Kategory (0 zeigt alle Kategorien an)"
 
 #. Translators: the label for a setting in SPL add-on settings to include 
track genre count in playlist snapshots window.
-#, fuzzy
 msgid "Genre count"
-msgstr "Anzahl Suchläufe"
+msgstr "Anzahl Genre"
 
 msgid "Top genre count (0 displays all genres)"
 msgstr "Anzahl des Top Genres (0 zeigt alle Genres an)"
@@ -1483,6 +1532,8 @@ msgstr "Anzahl des Top Genres (0 zeigt alle Genres an)"
 #. Translators: the label for a setting in SPL add-on settings to show 
playlist snaphsots window when the snapshots command is pressed once.
 msgid "&Show results window when playlist snapshots command is performed once"
 msgstr ""
+"&Zeige Ergebnisfenster, wenn die Tastenkombination für das Erstellen von "
+"Playlist-Statistiken einmal gedrückt wurde"
 
 #. Translators: Title of a dialog to configure metadata streaming status for 
DSP encoder and four additional URL's.
 msgid "Metadata streaming options"
@@ -1498,7 +1549,7 @@ msgstr ""
 
 #. Translators: A checkbox to let metadata streaming status be applied to the 
currently active broadcast profile.
 msgid "&Apply streaming changes to the selected profile"
-msgstr ""
+msgstr "&Übernehme Streaming-Einstellungen für das ausgewählte Profil"
 
 #. Translators: Title of a dialog to configure column announcements (order and 
what columns should be announced).
 msgid "Manage column announcements"
@@ -1527,14 +1578,12 @@ msgid "Move &down"
 msgstr "Abwärts bewegen"
 
 #. Translators: The title of Columns Explorer configuration dialog.
-#, fuzzy
 msgid "Columns Explorer"
-msgstr "Reihenfolge der Spalten:"
+msgstr "Spaltenexplorer"
 
 #. Translators: The title of Columns Explorer configuration dialog.
-#, fuzzy
 msgid "Columns Explorer for Track Tool"
-msgstr "Reihenfolge der Spalten:"
+msgstr "Spaltenexplorer für das Titelwerkzeug"
 
 #. Translators: The label for a setting in SPL add-on dialog to select column 
for this column slot.
 #, python-brace-format
@@ -1542,9 +1591,8 @@ msgid "Slot {position}"
 msgstr "Slot {position}"
 
 #. Translators: Title of a dialog to configure various status announcements 
such as announcing listener count.
-#, fuzzy
 msgid "Status announcements"
-msgstr "Pieptöne bei Statusansage"
+msgstr "Statusanzeige"
 
 #. Translators: the label for a setting in SPL add-on settings to announce 
scheduled time.
 msgid "Announce &scheduled time for the selected track"
@@ -1559,9 +1607,8 @@ msgid "&Announce name of the currently playing cart"
 msgstr "&Namen der aktuell abgespielten Karte ausgeben"
 
 #. Translators: the label for a setting in SPL add-on settings to announce 
currently playing track name.
-#, fuzzy
 msgid "&Track name announcement:"
-msgstr "&Meldung beim Durchsuchen der Bibliothek"
+msgstr "&Ansage des Titelnamen"
 
 #. Translators: One of the track name announcement options.
 msgid "automatic"
@@ -1580,6 +1627,8 @@ msgid ""
 "Include track player &position when announcing current and next track "
 "information"
 msgstr ""
+"Titel-Player-&Position bei der Ankündigung aktueller und nächster "
+"Titelinformationen mit einbeziehen"
 
 #. Translators: The title of a dialog to configure advanced SPL add-on options 
such as update checking.
 msgid "Advanced options"
@@ -1604,9 +1653,8 @@ msgstr ""
 "Assistenzschicht verwendet wird"
 
 #. Translators: The label for a setting in SPL add-on dialog to set keyboard 
layout for SPL Assistant.
-#, fuzzy
 msgid "SPL Assistant command &layout:"
-msgstr "SPL-Hilfe"
+msgstr "Darstellung des SPL-&Befehlsassistenten:"
 
 #. Translators: The confirmation prompt displayed when changing to the fastest 
development channel (with risks involved).
 msgid ""
@@ -1617,11 +1665,18 @@ msgid ""
 "to use stable releases, please answer no and switch to a more stable update "
 "channel. Are you sure you wish to switch to Test Drive Fast channel?"
 msgstr ""
+"Sie sind gerade dabei, auf den Test Drive Fast (Try) Builds Channel "
+"umzuschalten, den schnellsten und instabilsten Entwicklungskanal. Bitte "
+"beachten Sie, dass der ausgewählte Kanal möglicherweise Updates enthält, die "
+"zurzeit instabil sind und zum Testen und Senden von Feedback an den "
+"Erweiterungsentwickler verwendet werden sollten. Wenn Sie lieber stabile "
+"Releases verwenden möchten, antworten Sie bitte mit Nein und wechseln Sie zu "
+"einem stabileren Aktualisierungskanal. Sind Sie sicher, dass Sie auf den "
+"Kanal Test Drive Fast umschalten möchten?"
 
 #. Translators: The title of the channel switch confirmation dialog.
-#, fuzzy
 msgid "Switching to unstable channel"
-msgstr "Profile werden umgeschaltet."
+msgstr "Wechselt  zum nicht stabilen Kanal"
 
 #. Translators: The confirmation prompt displayed when changing update 
interval to zero days (updates will be checked every time Studio app module 
loads).
 msgid ""
@@ -1629,6 +1684,9 @@ msgid ""
 "will be checked every time NVDA and/or Studio starts. Are you sure you wish "
 "to continue?"
 msgstr ""
+"Das Aktualisierungsintervall wurde auf null Tage festgelegt, so dass "
+"Aktualisierungen der Studio-Erweiterung bei jedem Start von NVDA und/oder "
+"Studio gesucht werden. Sind Sie sicher, dass Sie weitermachen möchten?"
 
 #. Translators: The title of the update interval dialog.
 msgid "Confirm update interval"
@@ -1639,24 +1697,20 @@ msgid "Reset settings"
 msgstr "Einstellungen zurücksetzen"
 
 #. Translators: the label for resetting profile triggers.
-#, fuzzy
 msgid "Reset instant switch profile"
-msgstr "Wenn das Schnellprofil aktiv ist"
+msgstr "Instant-Switch-Profil zurücksetzen"
 
 #. Translators: the label for resetting profile triggers.
-#, fuzzy
 msgid "Delete time-based profile database"
-msgstr "Zeitbasierte Profile fehlen"
+msgstr "Zeitbasierte Profile löschen"
 
 #. Translators: the label for resetting encoder settings.
-#, fuzzy
 msgid "Remove encoder settings"
 msgstr "Einstellungen zurücksetzen"
 
 #. Translators: the label for resetting track comments.
-#, fuzzy
 msgid "Erase track comments"
-msgstr "Ende der Titel in Braille"
+msgstr "Titelkommentare löschen"
 
 #. Translators: A message to warn about resetting SPL config settings to 
factory defaults.
 msgid "Are you sure you wish to reset SPL add-on settings to defaults?"
@@ -1682,21 +1736,21 @@ msgstr "Konfiguration zurücksetzen"
 msgid "Another find dialog is open."
 msgstr "Ein weiteres Suchdialog ist geöffnet."
 
-#, fuzzy
 msgid "Enter or select the name or the artist of the track you wish to &search"
 msgstr ""
-"Geben Sie den Titel oder den Interpreten des zu suchenden Musikstücks ein."
+"Geben Sie den Titel oder den Interpreten des zu suchenden Musikstücks ein "
+"oder wählen Sie die Daten aus."
 
-#, fuzzy
 msgid "Enter or select text to be &searched in a column"
-msgstr "Geben Sie den Text ein, den Sie in der Spalte suchen möchten"
+msgstr ""
+"Geben Sie den Text ein oder wählen Sie den Text aus, den Sie in der Spalte "
+"suchen möchten"
 
 #. Translators: The label in track finder to search columns.
 msgid "C&olumn to search:"
 msgstr "Zu durchsuchende Spalte"
 
 #. Translators: The title of a dialog to find tracks with duration within a 
specified range.
-#, fuzzy
 msgid "Time range finder"
 msgstr "Zeit-Entfernungsmesser"
 
@@ -1718,9 +1772,8 @@ msgid "No track with duration between minimum and maximum 
duration."
 msgstr "Keine Titel mit Laufzeit zwischen Mindest- und Höchstdauer."
 
 #. Translators: Standard error title for find error (copy this from main 
nvda.po).
-#, fuzzy
 msgid "Time range find error"
-msgstr "Zeitbereich Fehler zu finden"
+msgstr "Zeitbereich, um Fehler zu finden"
 
 msgid "Countdown started"
 msgstr "Countdown gestartet"
@@ -1760,6 +1813,9 @@ msgid ""
 "Did you recently tell SPL add-on to use a different update channel? If so, "
 "please restart NVDA before checking for add-on updates."
 msgstr ""
+"Haben Sie kürzlich der SPL-Erweiterung mitgeteilt einen anderen Update-Kanal "
+"zu verwenden? Wenn ja, starten Sie NVDA neu, bevor Sie nach Aktualisierungen "
+"suchen."
 
 msgid "Update channel changed"
 msgstr "Update-Kanal geändert"
@@ -1769,9 +1825,8 @@ msgid "Error checking for update."
 msgstr "Fehler beim Suchen nach Aktualisierungen"
 
 #. Translators: Title of the add-on update check dialog.
-#, fuzzy
 msgid "Studio add-on update"
-msgstr "nach Erweiterungsaktualisierung suchen"
+msgstr "Aktualisierung für die Studio-Erweiterung"
 
 #. No need to interact with the user.
 #. Translators: Presented when no add-on update is available.
@@ -1786,18 +1841,16 @@ msgstr ""
 "Version aktualisieren?"
 
 #. Translators: The title of the dialog displayed while downloading add-on 
update.
-#, fuzzy
 msgid "Downloading Add-on Update"
-msgstr "nach Erweiterungsaktualisierung suchen"
+msgstr "Aktualisierung wird heruntergeladen"
 
 #. Translators: The progress message indicating that a connection is being 
established.
 msgid "Connecting"
 msgstr "Verbinden..."
 
 #. Translators: A message indicating that an error occurred while downloading 
an update to NVDA.
-#, fuzzy
 msgid "Error downloading add-on update."
-msgstr "Fehler beim Suchen nach Aktualisierungen"
+msgstr "Fehler beim Suchen nach Aktualisierungen für diese Erweiterung."
 
 #. Translators: The message displayed when an error occurs when opening an 
add-on package for adding.
 #, python-format
@@ -1805,6 +1858,8 @@ msgid ""
 "Failed to open add-on package file at %s - missing file or invalid file "
 "format"
 msgstr ""
+"Die Datei mit den Erweiterungspaketen aus %s konnte nicht geöffnet werden - "
+"Datei fehlt oder das Format ist unbekannt"
 
 #. Translators: The title of the dialog presented while an Addon is being 
updated.
 msgid "Updating Add-on"
@@ -1821,7 +1876,6 @@ msgstr "Update der Erweiterung von %s ist fehlgeschlagen"
 
 #. Help message for SPL Controller
 #. Translators: the dialog text for SPL Controller help.
-#, fuzzy
 msgid ""
 "\n"
 "After entering SPL Controller, press:\n"
@@ -1844,7 +1898,7 @@ msgid ""
 "Shift+R: Library scan progress."
 msgstr ""
 "\n"
-"Nach Eingabe SPL-Controller drücken: \n"
+"Nach Eingabe des SPL-Controllers drücke: \n"
 "A: Schaltet die Automatisierung an. \n"
 "Umschalt+A: Schaltet die Automatisierung ab. \n"
 "M: Schaltet das Mikrofon an. \n"
@@ -1856,7 +1910,10 @@ msgstr ""
 "U: Pause. \n"
 "S: Stop und ausblenden. \n"
 "T: Sofortiger Stopp.\n"
+"C: Sagt den Namen und die Dauer des gerade abspielenden Tracks an.\n"
 "E: Zeigt an, ob Codecs überwacht werden\n"
+"I: Sagt Anzahl der Zuhörer an.\n"
+"Q: Sagt Statusinformationen über das Studio an.\n"
 "R: Zeigt die verbleibende Zeit an\n"
 "Umschalt+R: Zeigt den Fortschritt beim Suchlauf der Bibliothek an."
 
@@ -1895,19 +1952,19 @@ msgstr ""
 "während dieser abgespielt wird."
 
 #. Translators: Announces number of items in the Studio's track library 
(example: 1000 items scanned).
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Scan in progress with {itemCount} items scanned"
 msgstr "Scanvorgang mit {itemCount} Einträge abgeschlossen."
 
 #. Translators: Announces number of items in the Studio's track library 
(example: 1000 items scanned).
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Scan complete with {itemCount} items scanned"
-msgstr "Scanvorgang mit {itemCount} Einträge abgeschlossen."
+msgstr "Kompletter Scanvorgang mit {itemCount} Einträgen abgeschlossen."
 
 #. Translators: Announces number of stream listeners.
-#, fuzzy, python-brace-format
+#, python-brace-format
 msgid "Listener count: {listenerCount}"
-msgstr "Die Anzahl der Zuhörer konnten nicht ermittelt werden."
+msgstr "Anzahl der Zuhörer: {listenerCount}"
 
 #. Translators: Presented when no track is playing in Station Playlist Studio.
 msgid "There is no track playing."
@@ -1917,6 +1974,8 @@ msgstr "Es wird momentan kein Track wiedergegeben."
 msgid ""
 "Announces Studio status such as track playback status from other programs"
 msgstr ""
+"meldet Studiostatus und Status der titelwiedergabe auch aus anderen "
+"Anwendungen"
 
 #. Translators: The title for SPL Controller help dialog.
 msgid "SPL Controller help"
@@ -1932,9 +1991,8 @@ msgid "Number of encoders monitored: {numberOfEncoders}: 
{streamLabels}"
 msgstr "Anzahl überwachter Encoder: {numberOfEncoders}: {streamLabels}"
 
 #. Translators: Text of the dialog when another alarm dialog is open.
-#, fuzzy
 msgid "Another encoder settings dialog is open."
-msgstr "Ein weiteres Suchdialog ist geöffnet."
+msgstr "Ein weiteres Dialog für Enkodierungseinstellungen ist geöffnet."
 
 #. Translators: The title of the encoder settings dialog (example: Encoder 
settings for SAM 1").
 #, python-brace-format
@@ -1946,22 +2004,20 @@ msgid "Stream &label"
 msgstr "Stream-&Bezeichnung"
 
 #. Translators: A checkbox in encoder settings to set if NvDA should switch 
focus to Studio window when connected.
-#, fuzzy
 msgid "&Focus to Studio when connected"
-msgstr "Bei Verbindungsaufbau zu SPL wechseln"
+msgstr "&Bei Verbindungsaufbau zu SPL wechseln"
 
 #. Translators: A checkbox in encoder settings to set if NvDA should play the 
next track when connected.
-#, fuzzy
 msgid "&Play first track when connected"
-msgstr "Ersten Titel nach dem Verbindungsaufbau abspielen"
+msgstr "&Ersten Titel nach dem Verbindungsaufbau abspielen"
 
 #. Translators: A checkbox in encoder settings to set if NvDA should monitor 
the status of this encoder in the background.
 msgid "Enable background connection &monitoring"
-msgstr ""
+msgstr "Aktiviert Hintergrundüberwachung und -Verbindungsaufbau"
 
 #. Translators: A checkbox in encoder settings to set if NvDA should play 
connection progress tone.
 msgid "Play connection status &beep while connecting"
-msgstr ""
+msgstr "Spielt Status der Verbindung ab &Piepton während Verbindungsaufbau"
 
 #. Translators: Status message for encoder monitoring.
 #, python-brace-format
@@ -2056,6 +2112,8 @@ msgid ""
 "Shows encoder configuration dialog to configure various encoder settings "
 "such as stream label."
 msgstr ""
+"Zeigt das Encoder-Konfiguationsdialog, wo beispielsweise Streambezeichnungen "
+"eingestellt werden können."
 
 msgid "Station Playlist Studio"
 msgstr "Station Playlist Studio"
@@ -2100,7 +2158,6 @@ msgstr "Übertragungsgeschwindigkeit: {transferRate}"
 
 #. Add-on description
 #. Translators: Long description to be shown for this add-on on add-on 
information from add-ons manager
-#, fuzzy
 msgid ""
 "Enhances support for StationPlaylist Studio.\n"
 "In addition, adds global commands for the studio from everywhere."
@@ -2108,3 +2165,14 @@ msgstr ""
 "Verbessert die Unterstützung für Station Playlist Studio.\n"
 "Des weiteren fügt es Tastenkombinationen für das Studio aus beliebigen "
 "Programmen hinzu."
+
+#~ msgid ""
+#~ "You are using an older version of Windows. From 2018 onwards, Studio add-"
+#~ "on will not support versions earlier than Windows 7 Service Pack 1. Add-"
+#~ "on 15.x LTS (long-term support) versions will support Windows versions "
+#~ "such as Windows XP until mid-2018."
+#~ msgstr ""
+#~ "Sie verwenden eine ältere Windowsversion. Ab 2018 unterstützt die Studio-"
+#~ "Erweiterung keine Versionen vor Windows 7 Service Pack 1. Erweiterung 15."
+#~ "x LTS (Langzeit-Support)-Versionen werden Windowsversionen wie Windows XP "
+#~ "bis Mitte 2018 unterstützen."

diff --git a/addon/locale/es/LC_MESSAGES/nvda.po 
b/addon/locale/es/LC_MESSAGES/nvda.po
index 8004a00..490eaf0 100755
--- a/addon/locale/es/LC_MESSAGES/nvda.po
+++ b/addon/locale/es/LC_MESSAGES/nvda.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: StationPlaylist 17.04\n"
 "Report-Msgid-Bugs-To: nvda-translations@xxxxxxxxxxxxx\n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2017-10-30 15:59+0100\n"
+"PO-Revision-Date: 2017-12-05 15:43+0100\n"
 "Last-Translator: Juan C. Buño <oprisniki@xxxxxxxxx>\n"
 "Language-Team: Add-ons translation team <LL@xxxxxx>\n"
 "Language: es_ES\n"
@@ -24,11 +24,12 @@ msgid ""
 "You are using an older version of Windows. This add-on requires Windows 7 "
 "Service Pack 1 or later."
 msgstr ""
+"Estás utilizando una versión antigua de Windows. Este complemento requiere "
+"de Windows 7 Service Pack 1 o posterior."
 
 #. Translators: Title of a dialog shown when installing Studio add-on on old 
Windows releases.
-#, fuzzy
 msgid "Old Windows version"
-msgstr "Se detectó una versión antigua de Windows"
+msgstr "versión antigua de Windows"
 
 #, python-brace-format
 msgid "{header}: {content}"

diff --git a/addon/locale/fr/LC_MESSAGES/nvda.po 
b/addon/locale/fr/LC_MESSAGES/nvda.po
index c8e8ec1..6ad6d89 100755
--- a/addon/locale/fr/LC_MESSAGES/nvda.po
+++ b/addon/locale/fr/LC_MESSAGES/nvda.po
@@ -5,10 +5,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: StationPlaylist 17.10\n"
+"Project-Id-Version: StationPlaylist 17.12\n"
 "Report-Msgid-Bugs-To: nvda-translations@xxxxxxxxxxxxx\n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2017-10-28 00:04+0200\n"
+"PO-Revision-Date: 2017-12-01 10:50+0100\n"
 "Last-Translator: Rémy Ruiz <remyruiz@xxxxxxxxx>\n"
 "Language-Team: Rémy Ruiz <remyruiz@xxxxxxxxx>\n"
 "Language: fr\n"
@@ -23,11 +23,12 @@ msgid ""
 "You are using an older version of Windows. This add-on requires Windows 7 "
 "Service Pack 1 or later."
 msgstr ""
+"Vous utilisez une ancienne version de Windows. Ce module complémentaire "
+"nécessite Windows 7 Service Pack 1 ou version ultérieure."
 
 #. Translators: Title of a dialog shown when installing Studio add-on on old 
Windows releases.
-#, fuzzy
 msgid "Old Windows version"
-msgstr "Ancienne version de Windows détectée"
+msgstr "Ancienne version de Windows"
 
 #, python-brace-format
 msgid "{header}: {content}"

diff --git a/addon/locale/gl/LC_MESSAGES/nvda.po 
b/addon/locale/gl/LC_MESSAGES/nvda.po
index e1b2633..0224cdd 100755
--- a/addon/locale/gl/LC_MESSAGES/nvda.po
+++ b/addon/locale/gl/LC_MESSAGES/nvda.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: StationPlaylist 17.04\n"
 "Report-Msgid-Bugs-To: nvda-translations@xxxxxxxxxxxxx\n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2017-10-30 15:59+0100\n"
+"PO-Revision-Date: 2017-12-05 15:45+0100\n"
 "Last-Translator: Juan C. Buño <oprisniki@xxxxxxxxx>\n"
 "Language-Team: Add-ons translation team <oprisniki@xxxxxxxxx>\n"
 "Language: gl\n"
@@ -24,11 +24,12 @@ msgid ""
 "You are using an older version of Windows. This add-on requires Windows 7 "
 "Service Pack 1 or later."
 msgstr ""
+"Estás a usar unnha versión vella do Windows. Este complemento require do "
+"Windows 7 Service Pack 1 ou posterior."
 
 #. Translators: Title of a dialog shown when installing Studio add-on on old 
Windows releases.
-#, fuzzy
 msgid "Old Windows version"
-msgstr "Detectouse una versión vella de Windows"
+msgstr "Versión vella de Windows"
 
 #, python-brace-format
 msgid "{header}: {content}"

diff --git a/addon/locale/pt_PT/LC_MESSAGES/nvda.po 
b/addon/locale/pt_PT/LC_MESSAGES/nvda.po
index 6bc0972..a7cb756 100644
--- a/addon/locale/pt_PT/LC_MESSAGES/nvda.po
+++ b/addon/locale/pt_PT/LC_MESSAGES/nvda.po
@@ -8,15 +8,15 @@ msgstr ""
 "Project-Id-Version: stationPlaylist 3.2\n"
 "Report-Msgid-Bugs-To: nvda-translations@xxxxxxxxxxxxx\n"
 "POT-Creation-Date: 2014-11-14 19:00+1000\n"
-"PO-Revision-Date: 2017-11-09 05:44-0800\n"
-"Last-Translator: Ângelo Abrantes <ampa4374@xxxxxxxxx>\n"
+"PO-Revision-Date: 2017-12-06 10:57+0000\n"
+"Last-Translator: Ângelo Miguel Abrantes <ampa4374@xxxxxxxxx>\n"
 "Language-Team: Equipa Portuguesa do NVDA <angelomiguelabrantes@xxxxxxxxx; "
 "rui.fontes@xxxxxxxxxxxxxxx>\n"
 "Language: pt_PT\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.9\n"
+"X-Generator: Poedit 2.0.1\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
 #. Translators: Presented when attempting to install Studio add-on on 
unsupported Windows releases.
@@ -24,9 +24,10 @@ msgid ""
 "You are using an older version of Windows. This add-on requires Windows 7 "
 "Service Pack 1 or later."
 msgstr ""
+"Está a usar uma versão antiga do Windows. este extra requer o Windows 7 "
+"Service Pack 1 ou posterior."
 
 #. Translators: Title of a dialog shown when installing Studio add-on on old 
Windows releases.
-#, fuzzy
 msgid "Old Windows version"
 msgstr "Detectada versão antiga do Windows."
 
@@ -414,8 +415,8 @@ msgstr "Anuncia o tempo, incluindo segundos"
 msgid ""
 "The add-on settings dialog is opened. Please close the settings dialog first."
 msgstr ""
-"A caixa de diálogo de configurações do add-on está aberta. Por favor, feche-"
-"a primeiro."
+"A caixa de diálogo de configurações do extra está aberta. Por favor, feche-a "
+"primeiro."
 
 #. Translators: The title of the message box
 #. Translators: The title of a dialog presented when an error occurs.
@@ -436,11 +437,11 @@ msgstr "Define o alarme do microfone (o padrão é 5 
segundos)."
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
 msgid "Opens SPL Studio add-on configuration dialog."
-msgstr "Abre o diálogo de configurações do SPL Studio"
+msgstr "Abre o diálogo de configurações do extra do SPL Studio"
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
 msgid "Opens SPL Studio add-on welcome dialog."
-msgstr "Abre o diálogo de boas vindas do SPL Studio"
+msgstr "Abre o diálogo de boas vindas do extra do SPL Studio"
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
 msgid "Toggles between various braille timer settings."
@@ -518,7 +519,7 @@ msgstr "A entrar no Explorador de placa"
 
 #. Translators: Presented when cart explorer is off.
 msgid "Exiting cart explorer"
-msgstr "a editar o explorador de placa"
+msgstr "a sair o explorador de placa"
 
 #. Translators: Input help mode message for a command in Station Playlist 
Studio.
 msgid "Toggles cart explorer to learn cart assignments."


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/425846b2df6c/
Changeset:   425846b2df6c
Branch:      None
User:        josephsl
Date:        2017-12-08 17:04:17+00:00
Summary:     Merge branch 'master' into extensionPointsR2

Affected #:  1 file

diff --git a/readme.md b/readme.md
index f831b5c..acbc30b 100755
--- a/readme.md
+++ b/readme.md
@@ -181,6 +181,10 @@ From studio window, you can press Alt+NVDA+0 to open the 
add-on configuration di
 
 If you are using Studio on a touchscreen computer running Windows 8 or later 
and have NVDA 2012.3 or later installed, you can perform some Studio commands 
from the touchscreen. First use three finger tap to switch to SPL mode, then 
use the touch commands listed above to perform commands.
 
+## Version 18.01
+
+* When using JAWS layout for SPL Assistant, update check command 
(Control+Shift+U) now works correctly.
+
 ## Version 17.12
 
 * Windows 7 Service Pack 1 or later is required.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/5f510283c4e0/
Changeset:   5f510283c4e0
Branch:      None
User:        josephsl
Date:        2017-12-13 17:26:26+00:00
Summary:     Merge branch 'master' into extensionPointsR2

Affected #:  3 files

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index f4bc4d2..c4f2fb8 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -989,6 +989,9 @@ class AlarmsCenter(wx.Dialog):
                        elif self.level == 3:
                                
splconfig.SPLConfig["MicrophoneAlarm"]["MicAlarm"] = 
self.micAlarmEntry.GetValue()
                                
splconfig.SPLConfig["MicrophoneAlarm"]["MicAlarmInterval"] = 
self.micIntervalEntry.GetValue()
+                               # #42 (18.01/15.12-LTS): don't forget to 
restart microphone alarm timer.
+                               import splmisc
+                               splmisc._restartMicTimer()
                elif self.level == 0:
                        parent = self.Parent
                        parent.endOfTrackTime = self.outroAlarmEntry.GetValue()

diff --git a/addon/globalPlugins/splUtils/__init__.py 
b/addon/globalPlugins/splUtils/__init__.py
index c4930fc..76ede29 100755
--- a/addon/globalPlugins/splUtils/__init__.py
+++ b/addon/globalPlugins/splUtils/__init__.py
@@ -336,10 +336,7 @@ class GlobalPlugin(globalPluginHandler.GlobalPlugin):
                "kb:h":"conHelp"
        }
 
-       __gestures={
-               #"kb:nvda+shift+`":"focusToSPLWindow",
-               #"kb:nvda+`":"SPLControllerPrefix"
-       }
+       __gestures={}
 
        # Support for Encoders
        # Each encoder is an overlay class, thus makes it easier to add 
encoders in the future by implementing overlay objects.

diff --git a/addon/globalPlugins/splUtils/encoders.py 
b/addon/globalPlugins/splUtils/encoders.py
index 129505b..e0c6b01 100755
--- a/addon/globalPlugins/splUtils/encoders.py
+++ b/addon/globalPlugins/splUtils/encoders.py
@@ -226,9 +226,6 @@ class EncoderConfigDialog(wx.Dialog):
                self.onCancel(None)
 
 
-# Support for various encoders.
-# Each encoder must support connection routines.
-
 class Encoder(IAccessible):
        """Represents an encoder from within StationPlaylist Studio or Streamer.
        This base encoder provides scripts for all encoders such as stream 
labeler and toggling focusing to Studio when connected.
@@ -261,7 +258,6 @@ class Encoder(IAccessible):
                except KeyError:
                        return False
 
-       # Comment this out until background monitor setter is modified.
        @property
        def backgroundMonitor(self):
                try:
@@ -284,6 +280,12 @@ class Encoder(IAccessible):
                else:
                        ui.message(message)
 
+       # Encoder connection reporter thread.
+       def connectStart(self, connecting=False):
+               statusThread = 
threading.Thread(target=self.reportConnectionStatus, 
kwargs=dict(connecting=connecting))
+               statusThread.start()
+               self.threadPool[self.IAccessibleChildID] = statusThread
+
        # A master flag setter.
        # Set or clear a given flag for the encoder given its ID, flag and flag 
container (currently a feature set).
        # Also take in the flag key for storing it into the settings file.
@@ -343,11 +345,7 @@ class Encoder(IAccessible):
                                        monitoring = 
self.threadPool[self.IAccessibleChildID].isAlive()
                                except KeyError:
                                        monitoring = False
-                               if not monitoring:
-                                       statusThread = 
threading.Thread(target=self.reportConnectionStatus)
-                                       statusThread.name = "Connection Status 
Reporter " + str(self.IAccessibleChildID)
-                                       statusThread.start()
-                                       
self.threadPool[self.IAccessibleChildID] = statusThread
+                               if not monitoring: self.connectStart()
                else:
                        for encoderType in encoderMonCount:
                                encoderMonCount[encoderType] = 0
@@ -376,6 +374,47 @@ class Encoder(IAccessible):
        # Translators: Input help mode message in SAM Encoder window.
        script_streamLabeler.__doc__=_("Opens a dialog to label the selected 
encoder.")
 
+       def removeStreamConfig(self, pos):
+               # An application of map successor algorithm.
+               global _encoderConfigRemoved
+               _removeEncoderID(self.encoderType, pos)
+               streamLabelsMap = self.streamLabelsMap
+               labelLength = len(streamLabelsMap)
+               if not labelLength or pos > max(streamLabelsMap.keys()):
+                       if _encoderConfigRemoved is not None:
+                               streamLabels.write()
+                               _encoderConfigRemoved = None
+                       return
+               elif labelLength  == 1:
+                       if not pos in streamLabelsMap:
+                               pos = list(streamLabelsMap.keys())[0]
+                               oldPosition = int(pos)
+                               streamLabelsMap[str(oldPosition-1)] = 
streamLabelsMap[pos]
+                       del streamLabelsMap[pos]
+               else:
+                       encoderPositions = sorted(streamLabelsMap.keys())
+                       # What if the position happens to be the last stream 
label position?
+                       if pos == max(encoderPositions): del 
streamLabelsMap[pos]
+                       else:
+                               # Find the exact or closest successor.
+                               startPosition = 0
+                               if pos == min(encoderPositions):
+                                       del streamLabelsMap[pos]
+                                       startPosition = 1
+                               elif pos > min(encoderPositions):
+                                       for candidate in encoderPositions:
+                                               if candidate >= pos:
+                                                       startPositionCandidate 
= encoderPositions.index(candidate)
+                                                       startPosition = 
startPositionCandidate+1 if candidate == pos else startPositionCandidate
+                                                       break
+                               # Now move them forward.
+                               for position in 
encoderPositions[startPosition:]:
+                                       oldPosition = int(position)
+                                       streamLabelsMap[str(oldPosition-1)] = 
streamLabelsMap[position]
+                                       del streamLabelsMap[position]
+               streamLabels[self.encoderType + "Encoders"] = streamLabelsMap
+               streamLabels.write()
+
        def script_streamLabelEraser(self, gesture):
                # Translators: The title of the stream configuration eraser 
dialog.
                streamEraserTitle = _("Stream label and settings eraser")
@@ -439,17 +478,13 @@ class Encoder(IAccessible):
                if streamLabels is None: loadStreamLabels()
                # 6.2: Make sure background monitor threads are started if the 
flag is set.
                if self.backgroundMonitor:
-                       if self.encoderType == "SAM": threadPool = 
SAMMonitorThreads
-                       elif self.encoderType == "SPL": threadPool = 
SPLMonitorThreads
+                       threadPool = self.threadPool
                        if self.IAccessibleChildID in threadPool:
                                if not 
threadPool[self.IAccessibleChildID].is_alive():
                                        del threadPool[self.IAccessibleChildID]
                                # If it is indeed alive... Otherwise another 
thread will be created to keep an eye on this encoder (undesirable).
                                else: return
-                       statusThread = 
threading.Thread(target=self.reportConnectionStatus)
-                       statusThread.name = "Connection Status Reporter " + 
str(self.IAccessibleChildID)
-                       statusThread.start()
-                       threadPool[self.IAccessibleChildID] = statusThread
+                       self.connectStart()
                        encoderMonCount[self.encoderType] += 1
 
        def reportFocus(self):
@@ -548,11 +583,7 @@ class SAMEncoder(Encoder):
                ui.message(_("Connecting..."))
                # Oi, status thread, can you keep an eye on the connection 
status for me?
                # To be packaged into a new function in 7.0.
-               if not self.backgroundMonitor:
-                       statusThread = 
threading.Thread(target=self.reportConnectionStatus, 
kwargs=dict(connecting=True))
-                       statusThread.name = "Connection Status Reporter " + 
str(self.IAccessibleChildID)
-                       statusThread.start()
-                       SAMMonitorThreads[self.IAccessibleChildID] = 
statusThread
+               if not self.backgroundMonitor: 
self.connectStart(connecting=True)
 
        def script_disconnect(self, gesture):
                gesture.send()
@@ -580,11 +611,7 @@ class SAMEncoder(Encoder):
                speech.speechMode = 0
                wx.CallAfter(self._samContextMenu, 7)
                # Oi, status thread, can you keep an eye on the connection 
status for me?
-               if not self.backgroundMonitor:
-                       statusThread = 
threading.Thread(target=self.reportConnectionStatus, 
kwargs=dict(connecting=True))
-                       statusThread.name = "Connection Status Reporter " + 
str(self.IAccessibleChildID)
-                       statusThread.start()
-                       SAMMonitorThreads[self.IAccessibleChildID] = 
statusThread
+               if not self.backgroundMonitor: 
self.connectStart(connecting=True)
                speech.speechMode = speechMode
 
        def script_disconnectAll(self, gesture):
@@ -614,6 +641,10 @@ class SAMEncoder(Encoder):
        def threadPool(self):
                return SAMMonitorThreads
 
+       @property
+       def streamLabelsMap(self):
+               return SAMStreamLabels
+
        def getStreamLabel(self, getTitle=False):
                if str(self.IAccessibleChildID) in SAMStreamLabels:
                        streamLabel = 
SAMStreamLabels[str(self.IAccessibleChildID)]
@@ -631,47 +662,6 @@ class SAMEncoder(Encoder):
                streamLabels["SAMEncoders"] = SAMStreamLabels
                streamLabels.write()
 
-       def removeStreamConfig(self, pos):
-               # An application of map successor algorithm.
-               global _encoderConfigRemoved
-               # Manipulate SAM encoder settings and labels.
-               _removeEncoderID("SAM", pos)
-               labelLength = len(SAMStreamLabels)
-               if not labelLength or pos > max(SAMStreamLabels.keys()):
-                       if _encoderConfigRemoved is not None:
-                               streamLabels.write()
-                               _encoderConfigRemoved = None
-                       return
-               elif labelLength  == 1:
-                       if not pos in SAMStreamLabels:
-                               pos = list(SAMStreamLabels.keys())[0]
-                               oldPosition = int(pos)
-                               SAMStreamLabels[str(oldPosition-1)] = 
SAMStreamLabels[pos]
-                       del SAMStreamLabels[pos]
-               else:
-                       encoderPositions = sorted(SAMStreamLabels.keys())
-                       # What if the position happens to be the last stream 
label position?
-                       if pos == max(encoderPositions): del 
SAMStreamLabels[pos]
-                       else:
-                               # Find the exact or closest successor.
-                               startPosition = 0
-                               if pos == min(encoderPositions):
-                                       del SAMStreamLabels[pos]
-                                       startPosition = 1
-                               elif pos > min(encoderPositions):
-                                       for candidate in encoderPositions:
-                                               if candidate >= pos:
-                                                       startPositionCandidate 
= encoderPositions.index(candidate)
-                                                       startPosition = 
startPositionCandidate+1 if candidate == pos else startPositionCandidate
-                                                       break
-                               # Now move them forward.
-                               for position in 
encoderPositions[startPosition:]:
-                                       oldPosition = int(position)
-                                       SAMStreamLabels[str(oldPosition-1)] = 
SAMStreamLabels[position]
-                                       del SAMStreamLabels[position]
-               streamLabels["SAMEncoders"] = SAMStreamLabels
-               streamLabels.write()
-
        __gestures={
                "kb:f9":"connect",
                "kb:control+f9":"connectAll",
@@ -744,11 +734,7 @@ class SPLEncoder(Encoder):
                connectButton.doAction()
                self.setFocus()
                # Same as SAM encoders.
-               if not self.backgroundMonitor:
-                       statusThread = 
threading.Thread(target=self.reportConnectionStatus, 
kwargs=dict(connecting=True))
-                       statusThread.name = "Connection Status Reporter"
-                       statusThread.start()
-                       SPLMonitorThreads[self.IAccessibleChildID] = 
statusThread
+               if not self.backgroundMonitor: 
self.connectStart(connecting=True)
        script_connect.__doc__=_("Connects to a streaming server.")
 
        # Announce SPL Encoder columns: encoder settings and transfer rate.
@@ -762,6 +748,10 @@ class SPLEncoder(Encoder):
        def threadPool(self):
                return SPLMonitorThreads
 
+       @property
+       def streamLabelsMap(self):
+               return SPLStreamLabels
+
        def getStreamLabel(self, getTitle=False):
                if str(self.IAccessibleChildID) in SPLStreamLabels:
                        streamLabel = 
SPLStreamLabels[str(self.IAccessibleChildID)]
@@ -779,45 +769,6 @@ class SPLEncoder(Encoder):
                streamLabels["SPLEncoders"] = SPLStreamLabels
                streamLabels.write()
 
-       def removeStreamConfig(self, pos):
-               global _encoderConfigRemoved
-               # This time, manipulate SPL ID entries.
-               _removeEncoderID("SPL", pos)
-               labelLength = len(SPLStreamLabels)
-               if not labelLength or pos > max(SPLStreamLabels.keys()):
-                       if _encoderConfigRemoved is not None:
-                               streamLabels.write()
-                               _encoderConfigRemoved = None
-                       return
-               elif labelLength  == 1:
-                       if not pos in SPLStreamLabels:
-                               pos = list(SPLStreamLabels.keys())[0]
-                               oldPosition = int(pos)
-                               SPLStreamLabels[str(oldPosition-1)] = 
SPLStreamLabels[pos]
-                       del SPLStreamLabels[pos]
-               else:
-                       encoderPositions = sorted(SPLStreamLabels.keys())
-                       if pos == max(encoderPositions): del 
SPLStreamLabels[pos]
-                       else:
-                               # Find the exact or closest successor.
-                               startPosition = 0
-                               if pos == min(encoderPositions):
-                                       del SPLStreamLabels[pos]
-                                       startPosition = 1
-                               elif pos > min(encoderPositions):
-                                       for candidate in encoderPositions:
-                                               if candidate >= pos:
-                                                       startPositionCandidate 
= encoderPositions.index(candidate)
-                                                       startPosition = 
startPositionCandidate+1 if candidate == pos else startPositionCandidate
-                                                       break
-                               # Now move them forward.
-                               for position in 
encoderPositions[startPosition:]:
-                                       oldPosition = int(position)
-                                       SPLStreamLabels[str(oldPosition-1)] = 
SPLStreamLabels[position]
-                                       del SPLStreamLabels[position]
-               streamLabels["SPLEncoders"] = SPLStreamLabels
-               streamLabels.write()
-
        __gestures={
                "kb:f9":"connect",
                "kb:control+NVDA+3":"announceEncoderSettings",


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/70074a3d79c7/
Changeset:   70074a3d79c7
Branch:      None
User:        josephsl
Date:        2017-12-14 19:32:11+00:00
Summary:     Merge branch 'master' into extensionPointsR2

Affected #:  1 file

diff --git a/readme.md b/readme.md
index acbc30b..11a8ac6 100755
--- a/readme.md
+++ b/readme.md
@@ -184,6 +184,7 @@ If you are using Studio on a touchscreen computer running 
Windows 8 or later and
 ## Version 18.01
 
 * When using JAWS layout for SPL Assistant, update check command 
(Control+Shift+U) now works correctly.
+* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4), 
changes such as enabling alarm and changes to microphone alarm interval are 
applied when closing the dialog.
 
 ## Version 17.12
 


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/17c3876d4a03/
Changeset:   17c3876d4a03
Branch:      None
User:        josephsl
Date:        2017-12-26 05:54:32+00:00
Summary:     Merge branch 'extensionPointsR2'

Affected #:  6 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 13931f3..895a13e 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -607,8 +607,7 @@ class AppModule(appModuleHandler.AppModule):
                except (IOError, AttributeError):
                        pass
                # #40 (17.12): react to profile switches.
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.register(self.actionProfileSwitched)
+               
splactions.SPLActionProfileSwitched.register(self.actionProfileSwitched)
                debugOutput("loading add-on settings")
                splconfig.initialize()
                # Announce status changes while using other programs.
@@ -927,9 +926,8 @@ class AppModule(appModuleHandler.AppModule):
                # #40 (17.12): replace this with a handler that responds to app 
module exit signal.
                # Also allows profile switch handler to unregister itself as 
well.
                # At the same time, close any opened SPL add-on dialogs.
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.unregister(self.actionProfileSwitched)
-                       splactions.SPLActionAppTerminating.notify()
+               
splactions.SPLActionProfileSwitched.unregister(self.actionProfileSwitched)
+               splactions.SPLActionAppTerminating.notify()
                debugOutput("closing microphone alarm/interval thread")
                global micAlarmT, micAlarmT2
                if micAlarmT is not None: micAlarmT.cancel()

diff --git a/addon/appModules/splstudio/splactions.py 
b/addon/appModules/splstudio/splactions.py
index 65d36ff..c4480c5 100644
--- a/addon/appModules/splstudio/splactions.py
+++ b/addon/appModules/splstudio/splactions.py
@@ -12,21 +12,16 @@ import sys
 py3 = sys.version.startswith("3")
 
 # Do not unlock the full power of action extension point until 2018.
-try:
-       import extensionPoints
-       actionsAvailable = True
-except ImportError:
-       actionsAvailable = False
+import extensionPoints
 
 # 40 (17.12): unconditionally define actions, but not until 2018.
-if actionsAvailable:
-       # Studio handle found, app module is fully ready.
-       SPLActionAppReady = extensionPoints.Action()
-       # Add-on settings were loaded.
-       SPLActionSettingsLoaded = extensionPoints.Action()
-       # Switching broadcast profiles.
-       SPLActionProfileSwitched = extensionPoints.Action()
-       # Settings are being saved.
-       SPLActionSettingsSaved = extensionPoints.Action()
-       # Studio is terminating.
-       SPLActionAppTerminating = extensionPoints.Action()
+# Studio handle found, app module is fully ready.
+SPLActionAppReady = extensionPoints.Action()
+# Add-on settings were loaded.
+SPLActionSettingsLoaded = extensionPoints.Action()
+# Switching broadcast profiles.
+SPLActionProfileSwitched = extensionPoints.Action()
+# Settings are being saved.
+SPLActionSettingsSaved = extensionPoints.Action()
+# Studio is terminating.
+SPLActionAppTerminating = extensionPoints.Action()

diff --git a/addon/appModules/splstudio/splconfig.py 
b/addon/appModules/splstudio/splconfig.py
index b5c30bf..00b9b9d 100755
--- a/addon/appModules/splstudio/splconfig.py
+++ b/addon/appModules/splstudio/splconfig.py
@@ -493,11 +493,7 @@ class ConfigHub(ChainMap):
                # #38 (17.11/15.10-LTS): can't wait two seconds for microphone 
alarm to stop.
                # #40 (17.12): all taken care of by profile switched 
notification.
                _restartMicTimer()
-               if splactions.actionsAvailable: 
splactions.SPLActionProfileSwitched.notify()
-               else:
-                       # Use the module-level metadata and microphone status 
reminder methods if told to do so now.
-                       if self["General"]["MetadataReminder"] in ("startup", 
"instant"):
-                               _metadataAnnouncer(reminder=True)
+               splactions.SPLActionProfileSwitched.notify()
 
        # Used from config dialog and other places.
        # Show switch index is used when deleting profiles so it doesn't have 
to look up index for old profiles.

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index 491d01d..c4f2fb8 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -32,7 +32,7 @@ class SPLConfigDialog(gui.SettingsDialog):
                SPLConfigHelper = gui.guiHelper.BoxSizerHelper(self, 
sizer=settingsSizer)
                # #40 (17.12): respond to app terminate notification by closing 
this dialog.
                # All top-level dialogs will be affected by this, and apart 
from this one, others will check for flags also.
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                # Broadcast profile controls were inspired by Config Profiles 
dialog in NVDA Core.
                # 7.0: Have a copy of the sorted profiles so the actual combo 
box items can show profile flags.
@@ -327,13 +327,7 @@ class SPLConfigDialog(gui.SettingsDialog):
                # Change metadata streaming.
                # 17.11: call the metadata connector directly, reducing code 
duplication from previous releases.
                # 17.12: replaced by an action, with config UI active flag set.
-               import splmisc, splactions
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
-               else:
-                       
splmisc.metadataConnector(servers=splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"])
-                       # Also restart microphone timer.
-                       splmisc._restartMicTimer()
+               
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
 
        def onAppTerminate(self):
                # Call cancel function when the app terminates so the dialog 
can be closed.
@@ -461,12 +455,7 @@ class SPLConfigDialog(gui.SettingsDialog):
                        return
                splconfig.SPLConfig.deleteProfile(name)
                # 17.11: make sure to connect to the right set of metadata 
servers and enable/disable microphone alarm if appropriate.
-               import splmisc, splactions
-               if splactions.actionsAvailable:
-                       
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
-               else:
-                       
splmisc.metadataConnector(servers=splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"])
-                       splmisc._restartMicTimer()
+               
splactions.SPLActionProfileSwitched.notify(configDialogActive=True)
                if name == self.switchProfile or name == self.activeProfile:
                        # 17.11/15.10-LTS: go through the below path if and 
only if instant switch profile is gone.
                        if name == self.switchProfile:
@@ -954,7 +943,7 @@ class AlarmsCenter(wx.Dialog):
                self.level = level
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                alarmsCenterHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                if level in (0, 1):
                        timeVal = parent.endOfTrackTime if level == 0 else 
splconfig.SPLConfig["IntroOutroAlarms"]["EndOfTrackTime"]
@@ -1123,7 +1112,7 @@ class MetadataStreamingDialog(wx.Dialog):
                self.func = func
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                metadataSizerHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                if func is None: labelText=_("Select the URL for metadata 
streaming upon request.")
                else: labelText=_("Check to enable metadata streaming, uncheck 
to disable.")

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 76be432..2c12cb1 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -88,7 +88,7 @@ class SPLFindDialog(wx.Dialog):
 
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                findSizerHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                findHistory = obj.appModule.findText if obj.appModule.findText 
is not None else []
                self.findEntry = findSizerHelper.addLabeledControl(findPrompt, 
wx.ComboBox, choices=findHistory)
@@ -167,7 +167,7 @@ class SPLTimeRangeDialog(wx.Dialog):
                self.func = func
 
                mainSizer = wx.BoxSizer(wx.VERTICAL)
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                minSizer = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, 
_("Minimum duration")), wx.HORIZONTAL)
                prompt = wx.StaticText(self, wx.ID_ANY, label=_("Minute"))
@@ -452,8 +452,7 @@ def 
metadata_actionProfileSwitched(configDialogActive=False):
        if splconfig.SPLConfig["General"]["MetadataReminder"] in ("startup", 
"instant"):
                _metadataAnnouncer(reminder=True)
 
-if splactions.actionsAvailable:
-       
splactions.SPLActionProfileSwitched.register(metadata_actionProfileSwitched)
+splactions.SPLActionProfileSwitched.register(metadata_actionProfileSwitched)
 
 # Microphone alarm checker.
 # Restart the microphone alarm timer if profile is switched and contains 
different mic alarm values.

diff --git a/addon/globalPlugins/splUtils/encoders.py 
b/addon/globalPlugins/splUtils/encoders.py
index fcf8856..e0c6b01 100755
--- a/addon/globalPlugins/splUtils/encoders.py
+++ b/addon/globalPlugins/splUtils/encoders.py
@@ -171,7 +171,7 @@ class EncoderConfigDialog(wx.Dialog):
                EncoderConfigDialog._instance = weakref.ref(self)
                # And to close this automatically when Studio dies.
                from appModules.splstudio import splactions
-               if splactions.actionsAvailable: 
splactions.SPLActionAppTerminating.register(self.onAppTerminate)
+               splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
                self.obj = obj
                self.curStreamLabel, title = obj.getStreamLabel(getTitle=True)


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/5f88e3d45ccd/
Changeset:   5f88e3d45ccd
Branch:      None
User:        josephsl
Date:        2017-12-26 06:02:44+00:00
Summary:     Readme: version requirement, NVDA 2017.4 is required due to 
extensive use of extension points.

Affected #:  1 file

diff --git a/readme.md b/readme.md
index dd756a6..fb3a5c5 100755
--- a/readme.md
+++ b/readme.md
@@ -10,7 +10,7 @@ For more information about the add-on, read the [add-on 
guide][4]. For developer
 
 IMPORTANT NOTES:
 
-* This add-on requires NVDA 2017.1 or later and StationPlaylist Studio 5.10 or 
later.
+* This add-on requires NVDA 2017.4 or later and StationPlaylist Studio 5.10 or 
later.
 * If using Windows 8 or later, for best experience, disable audio ducking mode.
 * add-on 8.0/16.10 requires Studio 5.10 or later. For broadcasters using 
Studio 5.0x and/or Windows XP, Vista or 7 without Service Pack 1, a [long-term 
support version][3] (15.x) is available. The last stable version to support 
Windows releases prior to 7 Service Pack 1 is 17.11.2.
 * Starting from 2018, [changelogs for old add-on releases][5] will be found on 
GitHub. This add-on readme will list changes from version 5.0 (2015 onwards).


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/7c74611dbe9e/
Changeset:   7c74611dbe9e
Branch:      None
User:        josephsl
Date:        2017-12-26 23:12:00+00:00
Summary:     Config UI: officially drop support for old Windows releases

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index c4f2fb8..b09197c 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -1444,10 +1444,7 @@ class AdvancedOptionsDialog(wx.Dialog):
                if len(self._updateChannels) > 1:
                        # Translators: The label for a combo box to select 
update channel.
                        labelText = _("&Add-on update channel:")
-                       if sys.getwindowsversion().build >= 7601: 
self.channels=advOptionsHelper.addLabeledControl(labelText, wx.Choice, 
choices=["Test Drive Fast", "Test Drive Slow", "stable"])
-                       else:
-                               
self.channels=advOptionsHelper.addLabeledControl(labelText, wx.Choice, 
choices=["stable", "longterm"])
-                               self._updateChannels = ("stable", "lts")
+                       
self.channels=advOptionsHelper.addLabeledControl(labelText, wx.Choice, 
choices=["Test Drive Fast", "Test Drive Slow", "stable"])
                        
self.channels.SetSelection(self._updateChannels.index(self.Parent.updateChannel))
                # Translators: A checkbox to toggle if SPL Controller command 
can be used to invoke Assistant layer.
                
self.splConPassthroughCheckbox=advOptionsHelper.addItem(wx.CheckBox(self, 
label=_("Allow SPL C&ontroller command to invoke SPL Assistant layer")))


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/d461c6b81d12/
Changeset:   d461c6b81d12
Branch:      None
User:        josephsl
Date:        2017-12-28 18:48:12+00:00
Summary:     Merge branch 'stable' of 
https://bitbucket.org/nvdaaddonteam/stationPlaylist

Affected #:  1 file

diff --git a/buildVars.py b/buildVars.py
index 8bf0905..837687b 100755
--- a/buildVars.py
+++ b/buildVars.py
@@ -20,7 +20,7 @@ addon_info = {
        "addon_description" : _("""Enhances support for StationPlaylist Studio.
 In addition, adds global commands for the studio from everywhere."""),
        # version
-       "addon_version" : "17.12",
+       "addon_version" : "18.01",
        # Author(s)
        "addon_author" : u"Geoff Shang, Joseph Lee and other contributors",
        # URL for the add-on documentation support


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/8bf8665b48ef/
Changeset:   8bf8665b48ef
Branch:      None
User:        josephsl
Date:        2017-12-29 11:03:36+00:00
Summary:     Merge branch 'stable'

Affected #:  5 files

diff --git a/addon/doc/ar/readme.md b/addon/doc/ar/readme.md
index 735e704..1884198 100644
--- a/addon/doc/ar/readme.md
+++ b/addon/doc/ar/readme.md
@@ -20,10 +20,10 @@ IMPORTANT NOTES:
   mode.
 * add-on 8.0/16.10 requires Studio 5.10 or later. For broadcasters using
   Studio 5.0x and/or Windows XP, Vista or 7 without Service Pack 1, a
-  long-term support version (15.x) is available. The last stable version to
-  support Windows releases prior to 7 Service Pack 1 is 17.11.2.
-* Starting from 2018, changelogs for old add-on releases will be found on
-  GitHub. This add-on readme will list changes from version 5.0 (2015
+  [long-term support version][3] (15.x) is available. The last stable
+  version to support Windows releases prior to 7 Service Pack 1 is 17.11.2.
+* Starting from 2018, [changelogs for old add-on releases][5] will be found
+  on GitHub. This add-on readme will list changes from version 5.0 (2015
   onwards).
 
 ## مفاتيح الاختصار
@@ -268,6 +268,14 @@ broadcast profiles.
 استخدم لمسة ب3 أصابع للانتقال لنمط اللمس, ثم استخدم أوامر اللمس المسرودة
 أعلاه لأداء المهام.
 
+## Version 18.01/15.12-LTS
+
+* When using JAWS layout for SPL Assistant, update check command
+  (Control+Shift+U) now works correctly.
+* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
+  changes such as enabling alarm and changes to microphone alarm interval
+  are applied when closing the dialog.
+
 ## Version 17.12
 
 * Windows 7 Service Pack 1 or later is required.
@@ -899,190 +907,9 @@ for stable releases.
   وخاصة بعد حذف أحد التشفيرات (لإعادة ترتيب أسماء ملفات التشغيل, اضغط على
   Control+F12, ثم قم باختيار موضع التشفير الذي قمت بحذفه).
 
-## مستجدات الإصدار 4.4/3.9
-
-* وظيفة البحث في المكتبة تعمل الآن في الإصدار 5.10 (مطلوب آخر نسخة من
-  الإصدار 5.10).
-
-## مستجدات الإصدار 4.3/3.8
-
-* عند الانتقال إلى جزء آخر من التطبيق كالانتقال إلى محاورة إدراج مسارات
-  أثناء تنشيط مستكشف التنويهات, فإن NVDA لم يعد يعلن عن رسائل التنويهات عند
-  ضغط المفاتيح الخاصة بذلك (على سبيل المثال, تحديد مكان مسار من محاورة إدراج
-  المسارات).
-* مفاتيح اختصارات مساعدة جديدة, تشمل التنقل بين الإعلان عن الأوقات المجدولة
-  وعدد المستمعين (Shift+S و Shift+i بالترتيب, لم يتم حفظها عبر الجلسات).
-* عند الخروج من التطبيق أثناء فتح أكثر من محاورة تحذير, فسيعلم NVDA بأنه قد
-  تم الخروج من التطبيق ولم يقم بحفظ أية تعديلات على المحاورات التحذيرية
-  المفتوحة.
-* ترجمة الإضافة لمزيد من اللغات
-
-## مستجدات الإصدار 4.2/3.7
-
-* لم يعد ينسى NVDA الاحتفاظ بتعريفات encoder الجديدة والتي تم تغييرها عندما
-  يقوم المستخدم بتسجيل الخروج من ويندوز أو عند إعادة تشغيل الجهاز.
-* عند حدوث خلل في ملف إعدادات الإضافة عند بدأ تشغيل NVDA, فسيسترجع NVDA
-  الإعدادات الافتراضية وستظهر رسالة تخبر المستخدم بذلك.
-* في الإصدار 3.7, تم تصحيح الخطأ الذي كان يحدث عند حزف المسارات بالإصدار
-  4.33 من الاستوديو (نفس الإصلاح تم لمستخدمي الإصدار 5.0x بالإصدار 4.1 من
-  الإضافة).
-
-## مستجدات الإصدار 4.1
-
-* في استوديو 5.0x, حزف مسار من عارض قائمة التشغيل الرئيسية لم يعد يتسبب في
-  إعلان NVDA عن المسار الموجود أسفل المسار الجديد النشط (تلاحظ هذه المشكلة
-  بوضوح إذا تم حزف المسار السابق للمسار الأخير حيث كان NVDA يقول في هذه
-  الحالة "مجهول").
-* معالجة العديد من قضايا البحث في المكتبة في إستوديو 5.10, ومن بين هذه
-  القضايا الإعلان عن مجموع العناصر بالمكتبة أثناء التحرك بمفتاح الانتقال
-  بمحاورة إدراج المسارات والقول "جاري البحث" عند محاولة ملاحظة البحث في
-  المكتبة عبر مساعد SPL 
-* عند استخدام سطر إلكتروني مع الإصدار 5.10 من SPL وعندما يكون المسار محدد,
-  فإن الضغط على المسافة لتحديد مسار آخر لم يعد يتسبب في عدم انعكاس حالة
-  المسار الجديد على السطر الإلكتروني.
-
-## مستجدات الإصدار 4.0/3.6
-
-الإصدار 4.0 من الإضافة يدعم الإصدار SPL Studio 5.00 وما بعدها, مع الإصدار
-3.x والذي صمم لتوفير بعض الخصائص الجديدة من إصدار الإضافة 4.0 للمستخدمين
-الذين يثبتون إصدار قديم من تطبيق SPL.
-
-* مفاتيح مساعدة جديدة لتطبيق SPL, وقت محدد للمسار (S), الوقت المتبقي لقائمة
-  التشغيل (D) ودرجة الحرارة (W إذا كانت ضمن الإعدادات).
-* مفاتيح اختصار جديدة بمساعد أوامر SPL, وتشمل شريط التقدم للبحث في المكتبة
-  (Shift+R) وتشغيل الميكروفون دون التلاشي (N). 
-* عند تشغيل أو تعطيل الميكروفون عبر مساعد أوامر SPL, فسيصدر صوت للتنبيه
-  بحالة تعطيل أو تشغيل الميكروفون.
-* الإعدادات مثل وقت نهاية المسار سيتم حفظها في ملف إعدادات صنع خصيصا لهذا
-  الغرض يوجد بمجلدك الشخصي وستحفظ الإعدادات مع ترقية الإضافة (4.0 وما
-  بعدها).
-* إضافة مفتاح الاختصار (Alt+NvDA+2 لضبط وقت التنبيه بمقدمة الأغنية وهو ما
-  بين 1 إلى 9 ثوان.
-* في محاورات نهاية المسار والتنبيه بالمقدمة, يمكنك استخدام السهم الأعلى
-  والأسفل لتغيير إعدادات التنبيه. إذا قمت بإدخال قيمة خاطئة, فسيضبط وقت
-  التنبيه على أقصى قيمة.
-* إضافة الأمر (Control+NVDA+4) لضبط الوقت الذي سيصدر بعده NVDA يخبرك به إن
-  الميكروفون مشغل لفترة.
-* إضافة خاصية للإعلان عن الوقت بالساعات, والدقائق والثوان (لم يتم توفير
-  مفتاح اختصار بعد)
-* أصبح بالإمكان تتبع البحث في المكتبة من خلال محاورة إدراج مسار أو من أي
-  مكان, مع وضع أمر لخيارات الإعلان عن البحث في المكتبة (Alt+NVDA+R) 
-* دعم أداة المسار, ويشمل ذلك إصدار صوت إذا كان للمسار بداية محددة وأوامر
-  للإعلان عن المعلومات المتوفرة على المسار مثل الإعلان عن مدة المسار ومكانه
-  بقائمة المسارات.
-* دعم StationPlaylist Encoder (Studio 5.00 وما بعده), مع توفير نفس الدعم
-  الذي نقدمه ل SAM Encoder.
-* في نوافذ encoder, لم يعد يصدر NVDA نغمات الخطأ عند إخبار NVDA بالانتقال
-  إلى نافذة الستوديو على الاتصال بالخادم أثناء تصغير نافذة الاستوديو.
-* لم تعد تسمع أخطاء عند حزف مواد معرفة.
-* أصبح بالإمكان مراقبة بداية ونهاية الأغنية بالبرايل وذلك باستخدام خيارات
-  ميقات البرايل (Control+Shift+X).
-* معالجة مشكلة كانت تحدث عند محاولة الانتقال لنافذة التطبيق من أي برنامج آخر
-  بعد تصغير كافة النوافذ مما كان يتسبب في ظهور شيء آخر.
-* عند استخدام الإصدار 5.01 من SPL أو ما قبله, فإن NVDA لم يعد يعلن عن بعض
-  معلومات الحالة لمرات متعددة, من أمثلة ذلك الوقت المحدد.
-
-## مستجدات الإصدار 3.4
-
-* التعامل بشكل صحيح مع التنويهات التي تم تعيين اختصار لها يشمل مفتاح التحكم
-  على سبيل المثال (control+f1) بنمط استكشاف التنويهات.
-* معالجة خطأ كان يحدث عند قراءة NVDA معلومات خاطئة عندما كنت تريد الحصول على
-  معلومات عن الوقت المتبقي والمنقضي في الإصدار 5.10 من SPL Studio 
-* ترجمة الإضافة لمزيد من اللغات
-
-## مستجدات الإصدار 3.0
-
-* في نمط استكشاف التنويهات, التعامل مع الاختصارات التي تشمل مفتاح التحكم
-  بشكل صحيح.
-* ترجمة الإضافة لمزيد من اللغات
-
-## مستجدات الإصدار 3.3
-
-* لم يعد من الضروري البقاء بنافذة sam encoder حتى إجراء الاتصال بخادم البث
-  باستخدام sam encoder.
-* معالجة مشكلة عدم عمل بعض اختصارات encoder عند الانتقال لنافذة sam من
-  البرامج الأخرى على سبيل المثال (أوامر تعريف البث).
-
-## مستجدات الإصدار 3.2
+## Older releases
 
-* إضافة اختصار للإعلان عن الوقت المتبقي من المسار الحالي (r).
-* تصحيح رسالة المساعدة التفاعلية لاختصار shift+f11 بنافذة sam encoder.
-* إذا تم استخدام الاستوديو القياسي بنمط استكشاف التنويهات, سيقوم NVDA بتنبيه
-  المستخدم عن عدم إتاحة مفاتيح صف الأرقام العلوي لتعيين اختصارات للتنويهات.
-* في الإصدار 5.10, عدم صدور صوت الخطأ أثناء البحث عن المسارات.
-* ترجمة الإضافة لمزيد من اللغات وتحديث الترجمة.
-
-## مستجدات الإصدار 3.1
-
-* في نافذة sam encoder, وضع اختصار (shift+f11) لتشغيل أول مسار بعد الاتصال
-  بالخادم.
-* معالجة العديد من الأخطاء عند الاتصال بخادم ب sam encoder, ومن بين هذه
-  المشكلات عدم القدرة على تنفيذ أوامر NVDA, وصمت NVDA بعد إجراء الاتصال
-  بالخادم, إصدار صوت الخطء بدلا من صوت الصفير للإعلان عن إتمام الاتصال.
-
-## مستجدات الإصدار 3.0
-
-* تم إضافة مستكشف التنويهات للتعرف على المفتاح المنوط بتشغيل كل تنويه (يمكن
-  تعيين مفاتيح ل96 تنويه).
-* تمت إضافة أوامر جديدة, بما في ذلك وقت المذيع (NVDA+Shift+F12) وعدد
-  المستمعين (i) وعنوان المسار التالي (n) في وضع مساعد أوامر SPL.
-* سيتم الإعلان عن الرسائل ذات الحالتين على السطر الإلكتروني بغض النظر عن وضع
-  الإعلان عن تلك الرسائل سواء كان صفير أم نطق.
-* عندما تقوم بتصغير نافذة StationPlaylist وتريد الانتقال إلى نافذة البرنامج
-  من أي مكان, فإن NVDA سيخبرك بأن النافذة مصغرة.
-* لم تعد تسمع صوت الخطأ عندما يكون الإعلان عن الحالة في وضع الصفير وعندما
-  تكون رسائل الحالة رسائل أخرى غير تشغيل وتعطيل (مثال: تشغيل التنويهات أو
-  الإعلانات).
-* لم تعد تسمع صوت الخطأ عند رغبتك في الحصول على معلومات مثل الوقت المتبقي
-  أثناء تنشيط نوافذ الاستوديو الأخرى غير نافذة قائمة المسارات (مثل محاورة
-  الخيارات). إذا تعذر الحصول على المعلومات المطلوبة, فإن NVDA سيخبرك بهذا.
-* أصبح من الممكن البحث عن مسار باسم المطرب حيث كنت في السابق لا تتمكن إلا من
-  البحث بعنوان المسار فقط.
-* دعم إضافة SAM Encoder الموجودة بتطبيق Winamp, بما في ذلك إمكانية تسمية
-  الملف الذي يبث عبر الخادم والتنقل بين تشغيل وتعطيل خاصية الرجوع لنافذة
-  الاستوديو بعد الاتصال بالخادم.
-* يتوفر ملف المساعدة للإضافة من مدير الإضافات البرمجية.
-
-## مستجدات الإصدار 2.1
-
-* معالجة خطأ كان يحدث عندما يكون المستخدم غير قادر على الحصول على معلومات
-  مثل تلك التي تعبر عن حالة الآلية وذلك عند تشغيل SPL Studio لأول مرة أثناء
-  تشغيل NVDA.
-
-## مستجدات الإصدار 2.0
-
-* قد تم إلغاء بعض الاختصارات العامة والخاصة بالبرنامج حتى يتسنى للمستخدم
-  تخصيص الأوامر من محاورة اختصارات NVDA (يحتاج الإصدار 2.0 من الإضافة
-  استخدام إصدار NVDA 2013.3 أو أعلى). 
-* إضافة المزيد من مساعد أوامر SPL كالإعلان عن حالة نمط التحرير
-* الآن يمكنك التحول إلى SPL أستديو حتى وإن كانت جميع النوافذ مصغرة (قد لا
-  يعمل أحيانا). 
-* امتداد وقت التحذير بنهاية المسار إلى 59 ثانية
-* يمكنك الآن البحث عن مسار في قائمة التشغيل بالضغط على Control+NVDA+F وكل من
-  NVDA+f3 أو NVDA+Shift+F3 للتنقل بين المسار التالي أو السابق على التوالي. 
-* أصبح NVDA يعلن أسماء مربعات التحرير والسرد الصحيحة (مثل محاورة الخيارات
-  وشاشة تنزيل البرنامج الأولى). 
-* معالجة خطأ كان يحدث عند قراءة NVDA معلومات خاطئة عندما كنت تريد الحصول على
-  معلومات عن الوقت المتبقي في الإصدار الخامس من SPL Studio 
-
-## مستجدات الإصدار 1.2
-
-* عند تثبيت الإصدار 4.x من تطبيق StationPlayList على أنظمة التشغيل 8/8.1 على
-  بعض الحواسيب, أصبح من الممكن الاستماع مرة أخرى إلى الوقت المنقضي والوقت
-  المتبقي للمسار.
-* ترجمة الإضافة لمزيد من اللغات
-
-## مستجدات الإصدار 1.1
-
-* إضافة مفتاح الاختصار (Control+NvDA+2) لوضع صوت تنبيهي لمعرفة نهاية المسار.
-* إصلاح خطأ برمجي يتعلق بعدم الإعلان عن بعض أسماء مربعات التحرير (وبخاصة
-  حقول التحرير بمحاورة الخيارات).
-* ترجمة الإضافة لمزيد من اللغات
-
-
-## مستجدات الإصدار 1.0
-
-* إصدار أولي
+Please see changelog link for release notes for old add-on releases.
 
 [[!tag dev stable]]
 
@@ -1090,6 +917,8 @@ for stable releases.
 
 [2]: https://addons.nvda-project.org/files/get.php?file=spl-dev
 
-[3]: http://josephsl.net/files/nvdaaddons/get.php?file=spl-lts16
+[3]: http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-lts16
 
 [4]: https://github.com/josephsl/stationplaylist/wiki/SPLAddonGuide
+
+[5]: https://github.com/josephsl/stationplaylist/wiki/splchangelog

diff --git a/addon/doc/de/readme.md b/addon/doc/de/readme.md
index 0550233..1c02eca 100644
--- a/addon/doc/de/readme.md
+++ b/addon/doc/de/readme.md
@@ -20,14 +20,13 @@ WICHTIGE HINWEISE:
 * Wenn Sie Windows 8 oder höher verwenden, setzen Sie die Reduzierung der
   Lautstärke anderer Audioquellen auf "nie" im Dialog Sprachausgabe im
   NVDA-Einstellungsmenü.
-* Erweiterungsversion 8.0/16.10 erfordert Studio 5.10 oder höher. Für
-  Broadcaster, die Studio 5.0x und/oder Windows XP, Vista oder 7 ohne
-  Service Pack 1 verwenden, steht eine Langzeit-Support-Version (15.x) zur
-  Verfügung. Die letzte stabile Version, die Windows-Versionen vor 7 Service
-  Pack 1 unterstützt, ist 17.11.2.
-* Ab 2018 werden Änderungsnotizen für veraltete Erweiterungsversionen auf
-  GitHub zu finden sein. Die Readme dieser Erweiterung listet Änderungen ab
-  Version 5.0 (2015) auf.
+* add-on 8.0/16.10 requires Studio 5.10 or later. For broadcasters using
+  Studio 5.0x and/or Windows XP, Vista or 7 without Service Pack 1, a
+  [long-term support version][3] (15.x) is available. The last stable
+  version to support Windows releases prior to 7 Service Pack 1 is 17.11.2.
+* Starting from 2018, [changelogs for old add-on releases][5] will be found
+  on GitHub. This add-on readme will list changes from version 5.0 (2015
+  onwards).
 
 ## Tastenkürzel
 
@@ -289,6 +288,14 @@ and have NVDA 2012.3 or later installed, you can perform 
some Studio
 commands from the touchscreen. First use three finger tap to switch to SPL
 mode, then use the touch commands listed above to perform commands.
 
+## Version 18.01/15.12-LTS
+
+* When using JAWS layout for SPL Assistant, update check command
+  (Control+Shift+U) now works correctly.
+* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
+  changes such as enabling alarm and changes to microphone alarm interval
+  are applied when closing the dialog.
+
 ## Version 17.12
 
 * Windows 7 Service Pack 1 oder höher ist erforderlich.
@@ -1035,226 +1042,9 @@ für stabile Versionen.
   Streabezeichnungen neu zuzuordnen, drücken Sie STRG+F12 und wählen Sie
   dann die Position des Encoders, den Sie entfernt haben.
 
-## Änderungen in 4.4/3.9
-
-* Die Funktion des Bibliotheks-Scans kann jetzt auch in Studio 5.10
-  verwendet werden (benötigt die neueste Version von Studio 5.10).
-
-## Änderungen in 4.3/3.8
-
-* Wenn Sie bei aktivem Kartenexplorer zu einem anderen Teil von Studio
-  wechseln, wie z.B. in den Dialog Titel einfügen, wird NVDA keine
-  Kartenbenachrichtigungen mehr ansagen, wenn Kartenbefehele gedrückt werden
-  (z.B. beim Finden eines Titels aus dem Dialog Titel einfügen).
-* Neue Tastenbefehle für den SPL-Assistenten, einschließlich der Umschaltung
-  der geplanten Zeitansage und der Anzahl der Zuhörer (Umschalt+S und
-  Umschalt+I). Diese Einstellungen werden nicht sitzungsübergreifend
-  gespeichert.
-* Beim Beenden von Studio, während verschiedene Alarmdialoge geöffnet
-  werden, wird dass Beenden von Studio von NVDA erkannt. NVDA speichert nun
-  keine kürzlich geänderten Alarmwerte ab.
-* Übersetzungen aktualisiert
-
-## Änderungen in 4.2/3.7
-
-* NVDA merkt sich nun neue und geänderte Encoder-Labels, wenn sich ein
-  Benutzer abmeldet oder einen Computer neu startet.
-* Wenn die Erweiterungskonfiguration beim Start von NVDA beschädigt wird,
-  stellt NVDA die Standardkonfiguration wieder her und zeigt eine
-  entsprechende Meldung an.
-* In der Erweiterungsversion 3.7 wurde das Fokusproblem beim Löschen von
-  Titeln in Studio 4.33 behoben. Dieselbe Korrektur ist für Studio
-  5.0x-Benutzer in der Erweiterungsversion 4.1 verfügbar.
-
-## Änderungen in 4.1
-
-* In Studio 5.0x wird das Löschen eines Titels aus dem Haupt-Playlist-Viewer
-  nicht mehr dazu führen, dass NVDA den Titel unterhalb des neu fokussierten
-  Titels ansagt. Dies war auffälliger, wenn der vorletzte Titel gelöscht
-  wurde. In diesem Fall sagte NVDA "unbekannt" an.
-* In Studio 5.10 wurden mehrere Probleme beim Überwachen der
-  Bibliotheks-Scans mit dem SPL-Assistenten behoben, einschließlich der
-  Ankündigung der Gesamtzahl der Elemente in der Bibliothek, während man im
-  Dialogfeld "Titel einfügen" die Registerkarten durchsucht und die Meldung
-  "Scan wird durchgeführt" ausgegeben wird.
-* Wenn Sie eine Braillezeile mit Studio 5.10 zum Auswählen eines Titels
-  unterhalb des aktuellen titels verwenden, wird nun beim Drücken von
-  LEERTASTE der vorherige Auswahlstatus richtig angezeigt.
-
-## Änderungen in 4.0/3.6
-
-Version 4.0 unterstützt SPL Studio 5.00 und höher, wobei 3.x einige neue
-Funktionen von 4.0 für Benutzer früherer Versionen von Studio bereitstellt.
-
-* Neue Tastenbefehle im SPL-Assistenten, einschließlich geplante Dauer für
-  den Titel (S), Restdauer für die Wiedergabeliste (D) und Temperatur (W,
-  falls konfiguriert). Zusätzlich wurden für Studio 5.x Playlist-Änderungen
-  (Y) und Titelhöhe (Shift+P) hinzugefügt.
-* Neue Befehle für den SPL-Controller, einschließlich des Fortschritts der
-  Bibliotheks-Scans (Umschalt+R) und der Aktivierung des Mikrofons ohne
-  Überblendung (N). Wenn Sie F1 drücken, öffnet sich ein Dialog mit einer
-  kompletten Befehlsliste.
-* Beim Aktivieren oder Deaktivieren des Mikrofons über den SPL-Controller
-  wird ein Piepton ausgegeben, der den Ein/Aus-Status anzeigt.
-* Einstellungen, wie z.B. das Ende der Titeldauer, werden in einer
-  speziellen Konfigurationsdatei in Ihrem Benutzer-Konfigurationsverzeichnis
-  gespeichert und bleiben bei Erweiterungsaktualisierungen (ab Version 4.0)
-  erhalten.
-* Es wurde ein Befehl (Alt+NvDA+2) hinzugefügt, mit dem die Alarmzeit für
-  das Intro eines Songs zwischen 1 und 9 Sekunden eingestellt werden kann.
-* Am Ende der Dialoge für Titel- und Intro-Benachrichtigungen können Sie mit
-  den Pfeiltasten nach oben und unten die Alarmeinstellungen ändern. Wird
-  ein falscher Wert eingegeben, wird der Alarmwert auf den Maximalwert
-  gesetzt.
-* Es wurde ein Befehl für die Zeiteinstellung hinzugefügt (STRG+NVDA+4), zu
-  der NVDA einen Ton wiedergibt, wenn das Mikrofon eine Weile aktiv war.
-* Es wurde eine Funktion für die Ansage der Zeit in Stunden, Minuten und
-  Sekunden hinzugefügt (Tastaturbefehl ist nicht zugewiesen).
-* Es ist nun möglich, Bibliotheks-Scans aus dem Dialogfeld"Titel einfügen"
-  oder von überall her zu verfolgen und mit einem speziellen Befehl
-  (Alt+NVDA+R) die Ansageoptionen für Bibliotheks-Scans umzuschalten.
-* Unterstützung für Titelwerkzeuge, einschließlich der Wiedergabe eines
-  Pieptons, wenn ein Titel ein Intro definiert hat. Unterstützung für
-  Befehle, um Informationen zu einem Titel abzurufen, wie z.B. Dauer und
-  Position in der Warteschlange.
-* Unterstützung für den StationPlaylist-Encoder (Studio 5.00 und höher), der
-  die gleiche Unterstützung bietet wie SAM-Encoder.
-* In Encoder-Fenstern gibt NVDA beim Minimieren des Studio-Fensters keine
-  Fehlertöne mehr aus, wenn NVDA aufgefordert wird, während der Verbindung
-  mit einem Streaming-Server auf Studio umzuschalten.
-* Fehler werden nach dem Löschen eines Streams mit einer Streambezeichnung
-  nicht mehr angesagt.
-* Mit Hilfe der Braille-Timer-Optionen (STRG+Umschalt+X) ist es nun möglich,
-  die Einleitung und das Ende des Titels per Braille-Schrift zu überwachen.
-* Es wurde ein Problem behoben, das beim Wechseln mit minimierten Fenstern
-  von einem beliebigen Programm aus zum Studio-Fenster auftrat. Dies führte
-  dazu, dass etwas anderes angezeigt wurde.
-* Wenn Sie Studio 5.01 und früher verwenden, wird NVDA bestimmte
-  Statusinformationen, wie z.B. die geplante Zeit, nicht mehr wiederholt
-  ankündigen.
-
-## Änderungen in 3.5
-
-* Wenn NVDA gestartet oder neu gestartet wird, während das Hauptfenster der
-  Wiedergabeliste von Studio 5.10 fokussiert ist, wird NVDA keine Fehlertöne
-  mehr abspielen. Beim Durchblättern von Titeln sagt NVDA nun die nächsten
-  und vorherigen Titel immer an.
-* Es wurde ein Problem behoben, das beim Ermittlungsversuch der
-  verbleibenden und verstrichenen Zeit für einen Titel in späteren Builds
-  von Studio 5.10 auftrat.
-* Übersetzungen aktualisiert
-
-## Änderungen in 3.4
-
-* Im Kartenexplorer werden Karten mit STRG (z.B. Strg+F1) nun korrekt
-  behandelt.
-* Übersetzungen aktualisiert
-
-## Änderungen in 3.3
-
-* Bei der Verbindung zu einem Streaming-Server mit SAM-Encoder ist es nicht
-  mehr erforderlich im Encoder-Fenster zu bleiben, bis die Verbindung
-  hergestellt ist.
-* Es wurde ein Problem behoben, bei dem Encoderbefehle
-  (z.B. Streambezeichner) nicht mehr funktionierten, wenn von anderen
-  Programmen auf SAM-Fenster umgeschaltet wurde.
-
-## Änderungen in 3.2
-
-* Im SPL-Controller wurde ein Befehl hinzugefügt, um die verbleibende Zeit
-  für den aktuell wiedergegebenen Titel (R) zu melden.
-* Im SAM-Encoder-Fenster wurde die Meldung des Modus der Eingabehilfe für
-  den Befehl Shift+F11 korrigiert.
-* Im Kartenexplorer wird NVDA beim Verwenden von Studio-Standard melden,
-  dass die Zahlreihenbefehle für die Zuweisung von Karten nicht verfügbar
-  sind.
-* In Studio 5.10 spielt der Titelfinder beim Durchsuchen von Titeln keine
-  Fehlertöne mehr ab.
-* neue und aktualisierte Übersetzungen.
-
-## Änderungen in 3.1
-
-* Im SAM Encoder-Fenster wurde ein Befehl (Shift+F11) hinzugefügt, um Studio
-  anzuweisen den ersten Titel bei erfolgreicher Verbindung abzuspielen.
-* Es wurden zahlreiche Fehler bei der Verbindung zu einem Server in SAM
-  Encoder behoben. Darunter z.B. die Probleme der fehlenden Ansage über den
-  Verbindungsstatus beim Ausführen von NVDA-Befehlen, wobei Fehlertöne
-  anstelle von Verbindungstönen bei erfolgreicher Verbindung ausgegeben
-  wurden.
-
-## Änderungen in 3.0
-
-* Der Karten-Explorer wurde hinzugefügt, um die Zuordnung von Karten zu
-  lernen (bis zu 96 Karten können zugewiesen werden).
-* Neue Befehle wurden im SPL-Assistenten hinzugefügt. Darunter sind
-  z.B. Sendezeit (NVDA+Shift+F12), Anzahl der Zuhörer (i) und nächste
-  Titelbezeichnung (n).
-* Meldungen wie z.B. Automatisierung werden nun in Brailleschrift angezeigt,
-  unabhängig von der Einstellung der Ansage.
-* Wenn das StationPlaylist-Fenster im Infobereich oder in der Taskleiste
-  minimiert ist, wird NVDA dies ansagen. Das gilt nur beim Versuch anderer
-  Programme auf SPL umzuschalten.
-* Fehlertöne werden nicht mehr ausgegeben, wenn unterschiedliche Ansagen von
-  Schaltern auf Pieptöne eingestellt sind bzw. andere Statusmeldungen als
-  ein / aus angesagt werden (Beispiel: Karten abspielen).
-* Fehlertöne werden nicht mehr ausgegeben, wenn während beim Versuch
-  Informationen wie die verbleibende Zeit abzurufen ein anderes
-  Studio-Fenster als die Titelliste (z.B. Einstellungsdialog) fokussiert
-  ist. Wenn die benötigten Informationen nicht gefunden werden, wird NVDA
-  dies ansagen.
-* Sie können jetzt einen Titel nach Künstlernamen suchen. Vorher konnte nach
-  Bezeichnungen gesucht werden.
-* Unterstützung für SAM Encoder, einschließlich der Möglichkeit, den Encoder
-  zu beschriften. Unterstützung eines Befehls zum Umschalten auf Studio,
-  wenn der ausgewählte Encoder angeschlossen ist.
-* Hilfe zur Erweiterung ist über den Dialog Erweiterungen verwalten
-  verfügbar.
-
-## Änderungen in 2.1
-
-* Es wurde ein Problem behoben, bei dem ein Benutzer Probleme beim abrufen
-  der Statusinformationen wie den Automatisierungsstatus hatte, wenn SPL 5.x
-  mit laufendem NVDA zum ersten Mal gestartet wurde.
-
-## Änderungen in 2.0
-
-* Einige globale und Anwendungsspezifische Tastenkombinationen wurden
-  entfernt, so dass Sie einen benutzerdefinierten Befehl aus dem Dialogfeld
-  Eingaben zuweisen können (Erweiterungsversion 2.0 erfordert NVDA 2013.3
-  oder höher).
-* Es wurden weitere Befehle des SPL-Assistenten hinzugefügt, wie z.B. der
-  Status im Kartenbearbeitungsmodus.
-* Sie können jetzt zu SPL Studio wechseln, auch wenn alle Fenster minimiert
-  sind. Dies funktioniert möglicherweise nicht in  allen Fällen.
-* Der Bereich für das Ende des Titel-Alarms wurde auf 59 Sekunden erhöht.
-* Sie können nun in einer Playlist nach einem Titel suchen (STRG+NVDA+F zum
-  Suchen, NVDA+F3 bzw. NVDA+Umschalt+F3 zum Suchen vorwärts oder rückwärts).
-* Kombinationsfelder werden von NVDA Genauer Bezeichnet (z.B. im Dialogfeld
-  "Einstellungen der Studio-Erweiterung" und in ersten SPL
-  Einstellungs-Dialogen).
-* Es wurde ein Problem behoben, wo NVDA falsche Informationen beim Abrufen
-  der verbleibenden Zeit für einen Titel in SPL Studio 5 angesagt hat.
-
-## Änderungen in 1.2
-
-* Es ist wieder möglich die verstrichene und verbleibende Zeit für einen
-  Titel abzurufen, wenn Station Playlist 4.x auf bestimmten PCs mit Windows
-  8/8.1 installiert ist.
-* Übersetzungen aktualisiert
+## Older releases
 
-## Änderungen in 1.1
-
-* Einen neuen Befehl wurde hinzugefügt (STRG + NVDA + 2), um die Länge des
-  Alarms für die verbleibende Abspielzeit eines Titels festzulegen.
-* Es wurde ein Fehler behoben, bei dem Feldnamen für bestimmte Eingabefelder
-  nicht angesagt wurden (insbesondere Eingabefelder im Dialog für die
-  Einstellungen der Studio-Erweiterung).
-* Verschiedene Übersetzungen hinzugefügt.
-
-
-## Änderungen in 1.0
-
-* Ehrstveröffentlichung
+Please see changelog link for release notes for old add-on releases.
 
 [[!tag dev stable]]
 
@@ -1262,6 +1052,8 @@ Funktionen von 4.0 für Benutzer früherer Versionen von 
Studio bereitstellt.
 
 [2]: https://addons.nvda-project.org/files/get.php?file=spl-dev
 
-[3]: http://josephsl.net/files/nvdaaddons/get.php?file=spl-lts16
+[3]: http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-lts16
 
 [4]: https://github.com/josephsl/stationplaylist/wiki/SPLAddonGuide
+
+[5]: https://github.com/josephsl/stationplaylist/wiki/splchangelog

diff --git a/addon/doc/es/readme.md b/addon/doc/es/readme.md
index ffda93f..1a6b5ed 100644
--- a/addon/doc/es/readme.md
+++ b/addon/doc/es/readme.md
@@ -20,7 +20,7 @@ NOTAS IMPORTANTES:
 * Si utilizas Windows 8 o posterior, para una mejor experiencia, deshabilita
   el modo atenuación de audio.
 * El complemento 8.0/16.10 requiere de Studio 5.10 o posterior. Para
-  transmisores que utilicen Studio 5.0x y/o Windows XP, Vista o 7 sin
+  retransmisores que utilicen Studio 5.0x y/o Windows XP, Vista o 7 sin
   Service Pack 1, está disponible una versión de soporte extendido
   (15.x). La última versión estable para soportar versiones de Windows
   anteriores a 7 Service Pack 1 es 17.11.2.
@@ -308,6 +308,14 @@ realizar algunas órdenes de Studio desde la pantalla 
táctil. Primero utiliza
 un toque con tres dedos para cambiar a modo SPL, entonces utiliza las
 órdenes táctiles listadas arriba para llevar a cabo tareas.
 
+## Version 18.01/15.12-LTS
+
+* When using JAWS layout for SPL Assistant, update check command
+  (Control+Shift+U) now works correctly.
+* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
+  changes such as enabling alarm and changes to microphone alarm interval
+  are applied when closing the dialog.
+
 ## Versión 17.12
 
 * Se requiere Windows 7 Service Pack 1 o posterior.
@@ -1050,225 +1058,9 @@ versión para versiones estables.
   de cadena, pulsa Control+F12, después selecciona la posición del
   codificador que has eliminado).
 
-## Cambios para 4.4/3.9
-
-* La función Library scan ahora funciona en Studio 5.10 (requiere la última
-  compilación de Studio 5.10).
-
-## Cambios para 4.3/3.8
-
-* Cuando se cambia a otra parte de Studio tal como el diálogo insertar
-  pistas mientras el explorador de cart está activo, NVDA ya no anunciará
-  mensajes de cart cuando se presionan las teclas de cart (por ejemplo,
-  localizar una pista desde el diálogo insertar pistas.).
-* Nuevas teclas de SPL Assistant, incluyendo el comnutado del anunciado de
-  la hora programada y recuento de oyentes (Shift+S y Shift+I,
-  respectivamente, no guardadas a través de sesiones).
-* Cuando se sale de Studio mientras  varios diálogos de alarma están
-  abiertos, NVDA detectará que Studio ha sido cerrado y no guardará los
-  valores de alarma modificados recientemente.
-* Traducciones actualizadas.
-
-## Cambios para 4.2/3.7
-
-* NVDA ya no se olvidará de retener las etiquetas nuevas y cambiadas del
-  codificador cuando un usuario cierre la sesión o reinicie el ordenador.
-* Cuando la configuración del complemento se corrompe al iniciarse NVDA,
-  éste restaurará la configuración predeterminada y mostrará un mensaje para
-  informar al usuario de este hecho.
-* En el complemento 3.7, el problema del foco visto al eliminar pistas en
-  Studio 4.33 se ha corregido (La misma corrección está disponible para los
-  usuarios de Studio 5.0x en el complemento 4.1).
-
-## Cambios para 4.1
-
-* En Studio 5.0x, al eliminar una pista desde el visualizador principal de
-  lista de reproducción ya no causará que NVDA anuncie la pista debajo de la
-  enfocada recientemente (más notable si la segunda fue eliminada, en cuyo
-  caso NVDA dice "desconocido").
-* Corregidos varios problemas con el escaneado de la biblioteca en Studio
-  5.10, incluyendo el anunciado del número total de elementos en la
-  biblioteca mientras se tabula por el diálogo insertar pistas y diciendo
-  "el escaneado está en progreso" cuando se intenta monitorizar los
-  escaneados de la biblioteca a través del SPL Assistant.
-* Cuando se utiliza una pantalla braille con Studio 5.10 y si  se marca una
-  pista, pulsando ESPACIO para marcar una pista anterior ya no se causa que
-  el braille no refleje el nuevo estado marcado.
-
-## Cambios para  4.0/3.6
-
-La versión 4.0 soporta SPL Studio 5.00 y posteriores, con 3.x diseñado para
-proporcionar algunas características nuevas desde 4.0 para los usuarios
-utilizando versiones anteriores de Studio.
-
-* Nuevas teclas para el SPL Assistant, incluyendo el tiempo programado para
-  la pista (S), duración restante para la lista de reproducción (D) y
-  temperatura (W si se configuró). además, para Studio 5.x, se añadió
-  modificación de la lista de reproducción (Y) y tono de la pista (Shift+P).
-* Nuevas órdenes del SPL Controller, incluyendo progreso de los escaneados
-  de la biblioteca (Shift+R) y habilitación del micrófono sin fade
-  (N). También, pulsando F1 se despliega un diálogo mostrando las órdenes
-  disponibles.
-* Cuando se habilita o deshabilita el micrófono a través de SPL Controller,
-  se reproducirán pitidos para indicar el estado activo/desactivo.
-* Las opciones tales como tiempo de fin de la pista se guardan en un fichero
-  dedicado para la configuración en tu directorio de configuración del
-  usuario y se conservan durante las actualizaciones de los complementos
-  (versión 4.0 y posteriores).
-* Añadida una orden (Alt+NVDA+2) para ajustar el tiempo de alarma de intro
-  de la canción entre 1 y 9 segundos.
-* En los diálogos de alarma de final y de intro de pista, puedes utilizar
-  flechas arriba y abajo para cambiar las opciones de alarma. Si se
-  introduce un valor erróneo, el valor de la alarma se pone en el valor
-  máximo.
-* Añadida una orden (Control+NVDA+4) para configurar un tiempo en el que
-  NVDA reproducirá sonido cuando el micrófono se haya activado por un rato.
-* Añadida una característica para anunciar el tiempo en horas, minutos y
-  segundos (orden no asignada).
-* Ahora es posible seguir los escaneados de la biblioteca desde el diálogo
-  Insert Tracks o desde cualquier lugar, y una orden dedicada (Alt+NVDA+R)
-  para conmutar el anunciado de las opciones del escaneado de la biblioteca.
-* Soporte para Track Tool, incluyendo la reproducción de un pitido si una
-  pista tiene una intro definida y órdenes para anunciar información sobre
-  una pista tal como duración y posición en la cola.
-* Soporte para codificador StationPlaylist (Studio 5.00 y posteriores),
-  proporcionando el mismo nivel de soporte que el encontrado en el soporte
-  al codificador SAM.
-* En las ventanas del codificador, NVDA ya no reproduce tonos de error
-  cuando se le dijo a NVDA que cambiase Studio al conectarse a un servidor
-  de streaming mientras la ventana de Studio estaba minimizada.
-* Los errores ya no se escuchan después de eliminar un stream con una
-  etiqueta stream fijada allí.
-* Ahora es posible monitorizar la introducción y el final de la pista a
-  través del braille utilizando las opciones del temporizador braille
-  (Control+Shift+X).
-* Corregido un fallo donde se intentaba cambiar a la ventana del Studio
-  desde cualquier programa después de que todas las ventanas fueran
-  minimizadas causando que apareciera alguna otra cosa.
-* Cuando se utiliza Studio 5.01 y posteriores, NVDA ya no anunciará cierta
-  información de estado tal como el tiempo programado varias veces.
-
-## Cambios para 3.5
-
-* Cuando NVDA se inicia o se reinicia mientras la ventana principal de la
-  lista de reproducción de Studio 5.10 está enfocada, NVDA ya no reproducirá
-  tonos de error y/o no anunciará las pistas siguiente o anterior cuando se
-  navegue por las pistas.
-* Corregido un problema al intentar obtener el tiempo restante y el tiempo
-  transcurrido para una pista en las compilaciones más recientes de Studio
-  5.10.
-* Traducciones actualizadas.
-
-## Cambios para 3.4
-
-* En el explorador de cart, los carts involucrados con la tecla control
-  (tales como Ctrl+F1) ahora se manejan correctamente.
-* Traducciones actualizadas.
+## Older releases
 
-## Cambios para 3.3
-
-* Cuando se conecte a un servidor de streaming utilizando el codificador
-  SAM, ya no se requiere permanecer en la ventana del codificador hasta que
-  la conexión se establezca.
-* Corregido un fallo donde las órdenes  del codificador (por ejemplo, stream
-  labeler) ya no funcionarían al cambiar a la ventana SAM desde otros
-  programas.
-
-## Cambios para 3.2
-
-* Añadida una orden a SPL Controller para informar del tiempo restante para
-  la pista actual en reproducción (R).
-* En la ventana del codificador SAM, ha sido corregido el mensaje del modo
-  ayuda de entrada para la orden Shift+F11
-* En el explorador de cart, si el Studio Standard está en uso, NVDA alertará
-  que un número de órdenes de fila no estarán disponibles para asignaciones
-  de cart.
-* En Studio 5.10, el buscador de pistas ya no reproduce tonos de error al
-  buscar por las pistas.
-* Traducciones nuevas y actualizadas.
-
-## Cambios para 3.1
-
-* En la ventana de SAM Encoder, se añadió una orden (Shift+F11) para decir a
-  Studio que reproduzca la primera pista cuando se conecte.
-* Corregidos numerosos errores cuando se conecta a un servidor en Encoder
-  SAM , incluyendo la incapacidad para llevar a cabo las órdenes de NVDA ,
-  NVDA no anuncia cuando la conexión ha sido establecida y emite tonos de
-  error en lugar del pitido de conexión que se reproduce cuando se conecta .
-
-## Cambios para 3.0
-
-* Añadido explorador de Carts para aprender las asignaciones de cart (pueden
-  asignarse más de 96 carts).
-* Añadidas nuevas órdenes, incluyendo tiempo de emisión (NVDA+Shift+F12) y
-  recuento de oyentes (i) y título de siguiente pista (n) en SPL Assistant.
-* Ahora conmutar mensajes tales como la automatización se muestra en braille
-  independientemente de la opción toggle announcement.
-* Cuando la ventana StationPlaylist está minimizada en la bandeja del
-  sistema (área de notificaciones), NVDA anunciará este hecho cuando se
-  trate de cambiar a SPL desde otros programas.
-* Los tonos de error ya no se escuchan cuando conmutar anunciado esté
-  ajustado a pitidos y los mensajes de estado diferentes de
-  activado/desactivado se anuncian (ejemplo: la reproducción de carts).
-*  Los tonos de error ya no se escuchan cuando se intenta obtener
-  información tal como tiempo restante mientras otra ventana de Studio
-  diferente a  la lista de pistas (tal como el diálogo Options) esté
-  enfocada. Si la información necesaria no se encuentra, NVDA anunciará este
-  hecho.
-* Ahora es posible buscar una pista por  nombre de artista. Anteriormente
-  podías buscar por título de pista.
-* Soporte para el SAM Encoder, incluyendo la capacidad para etiquetar el
-  codificador y una orden conmutable para cambiar a Studio cuando el
-  codificador seleccionado está conectado.
-* La ayuda para el complemento está disponible desde el Administrador de
-  Complementos.
-
-## Cambios para 2.1
-
-* Solucionado un fallo donde el usuario no podía obtener información de
-  estado tal como estado de automatización cuando SPL 5.x se lanzó antes de
-  que NVDA estuviera en ejecución.
-
-## Cambios para 2.0
-
-* Algunos atajos de teclado globales y de aplicaciones específicas se
-  quitaron por lo que puedes asignar una orden personalizada en el diálogo
-  Gestos de entrada (el complemento en su versión 2.0 requiere de NVDA
-  2013.3 o posterior).
-* Añadidas más órdenes del asistente de SPL tales como el estado del modo
-  cart edit.
-* Ahora puedes cambiar a SPL Studio incluso con todas las ventanas
-  minimizadas (podrá no funcionar en algunos casos).
-* Extendido el rango de la alarma de fin de pista a 59 segundos.
-* Ahora puedes buscar una pista en una lista de reproducción(Control+NVDA+F
-  para encontrar, NVDA+F3 o NVDA+Shift+F3 encontrar hacia delante o hacia
-  atrás, respectivamente).
-* Se anuncian los nombres correctos de los cuadros combinados por NVDA(por
-  ejemplo el diálogo Opciones de configuración y las pantallas iniciales de
-  SPL).
-* Solucionado un fallo donde  NVDA anunciaba información incorrecta cuando
-  trataba de obtener el tiempo restante para una pista en SPL Studio 5.
-
-## Cambios para 1.2
-
-* Cuando Station Playlist 4.x está instalado en ciertos ordenadores con
-  Windows 8/8.1, es posible escuchar de nuevo los tiempos transcurridos y
-  restantes de una pista.
-* Traducciones actualizadas.
-
-## Cambios para 1.1
-
-* Añadida una orden (Control+NVDA+2) para establecer una alarma al final de
-  la pista.
-* Corregido un error en el que los nombres de campos para ciertos campos de
-  edición no se anunciaban (particularmente campos de edición en el diálogo
-  de opciones).
-* Añadidas varias traducciones.
-
-
-## Cambios para 1.0
-
-* Versión inicial.
+Please see changelog link for release notes for old add-on releases.
 
 [[!tag dev stable]]
 
@@ -1279,3 +1071,5 @@ utilizando versiones anteriores de Studio.
 [3]: http://josephsl.net/files/nvdaaddons/get.php?file=spl-lts16
 
 [4]: https://github.com/josephsl/stationplaylist/wiki/SPLAddonGuide
+
+[4]: https://github.com/josephsl/stationplaylist/wiki/SPLAddonGuide

diff --git a/addon/doc/fr/readme.md b/addon/doc/fr/readme.md
index ea32304..1395f4f 100644
--- a/addon/doc/fr/readme.md
+++ b/addon/doc/fr/readme.md
@@ -21,11 +21,12 @@ NOTES IMPORTANTES :
   désactiver le Mode d'atténuation audio.
 * le module complémentaire 8.0/16.10 requiert Studio 5.10 ou une version
   ultérieure. Pour les diffusions utilisant Studio 5.0x et/ou Windows XP,
-  Vista ou 7 sans Service Pack 1, une version prenant en charge le long-term
-  (15.x) est disponible. La dernière version stable prenant en charge les
-  versions de Windows antérieures à la 7 Service Pack 1 est la 17.11.2.
-* À partir de 2018, les journal des changements des anciennes versions du
-  module complémentaire seront trouvés sur GitHub. Ce fichier readme
+  Vista ou 7 sans Service Pack 1, une [version prenant en charge le
+  long-term][3] (15.x) est disponible. La dernière version stable prenant en
+  charge les versions de Windows antérieures à la 7 Service Pack 1 est la
+  17.11.2.
+* À partir de 2018, [les journal des changements des anciennes versions du
+  module complémentaire][5] seront trouvés sur GitHub. Ce fichier readme
   ajoutera les changements depuis la version 5.0 (à partir de 2015).
 
 ## Raccourcis clavier
@@ -315,6 +316,14 @@ un écran tactile. Tout d'abord utiliser une tape à trois 
doigts pour
 basculer en mode SPL, puis utilisez les commandes tactile énumérées
 ci-dessus pour exécuter des commandes.
 
+## Version 18.01/15.12-LTS
+
+* When using JAWS layout for SPL Assistant, update check command
+  (Control+Shift+U) now works correctly.
+* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
+  changes such as enabling alarm and changes to microphone alarm interval
+  are applied when closing the dialog.
+
 ## Version 17.12
 
 * Windows 7 Service Pack 1 ou ultérieur est requis.
@@ -1127,231 +1136,9 @@ year.month pour les publications stable.
   les étiquettes de flux, appuyez sur Contrôle+F12, puis sélectionnez la
   position de l'encodeur, que vous avez supprimé).
 
-## Changements pour les versions 4.4/3.9
-
-* La fonction du balayage de la bibliothèque fonctionne désormais dans
-  Studio 5.10 (il nécessite la dernière version de Studio 5.10).
-
-## Changements pour les versions 4.3/3.8
-
-* Lors du basculement vers une autre partie du Studio tel que la boîte de
-  dialogue insérer des pistes pendant que l'explorateur de chariot est
-  active, NVDA n'annoncera plus le messages du chariot lorsque on appuie sur
-  les touches chariot (par exemple, lors de la localisation d'une piste
-  depuis la boîte de dialogue insérer des pistes).
-* Nouvelles touches Assistant SPL, y compris le basculement de l'anonce du
-  temps planifier  et le nombre d'auditeurs (Maj+S et Maj+I, respectivement,
-  pas enregistré entre les sessions).
-* En quittant Studio alors que les différentes boîtes de dialogue des alarme
-  sont ouverts, NVDA détectera que Studio a été quitté et ne sauvera pas les
-  valeurs des alarme récemment modifiée.
-* Mises à jour des traductions.
+## Older releases
 
-## Changements pour les versions 4.2/3.7
-
-* NVDA n'oubliera plus de conserver les nouvelles étiquettes et modifiés
-  l'encodeur lorsqu'un utilisateur se déconnecte ou redémarre un ordinateur.
-* Lorsque la configuration du module complémentaire devient corrompue au
-  démarrage de NVDA, NVDA restaurera la configuration par défaut et affiche
-  un message pour informer l'utilisateur de ce fait.
-* Dans le module complémentaire 3.7, problème de focus vu lors de la
-  suppression des pistes dans Studio 4.33 a été corrigée (même correctif est
-  disponible pour les utilisateurs de Studio 5.0x dans le module
-  complémentaire 4.1).
-
-## Changements pour la version 4.1
-
-* Dans Studio 5.0x, lors de la suppression d'une piste depuis la visionneuse
-  de la playlist principale il ne provoque plus que NVDA annonce la piste en
-  dessous de la piste récemment focalisée (plus perceptible si la deuxième à
-  la dernière piste a été supprimée, auquel cas NVDA dit "inconnu").
-* Correction de plusieurs problèmes de balayage de la bibliothèque dans
-  Studio 5.10, y compris annonçant le nombre total d'éléments dans la
-  bibliothèque lors de la tabulation à travers  de la boîte de dialogue
-  Insérer des pistes et la verbalisation "balayage est en cours" lorsque
-  vous essayer de contrôler les balayages de la bibliothèque via l'Assistant
-  SPL.
-* Lorsque vous utilisez un terminal braille avec Studio 5.10 et si une piste
-  est coché, en appuyant sur espace pour cocher une piste ci-dessous le
-  braille   il ne provoque plus et ne va pas renvoyer l'état récemment
-  coché.
-
-## Changements pour les versions 4.0/3.6
-
-Version 4.0 supporte SPL Studio 5.00 et ultérieure , avec la 3.x est conçu
-pour fournir de nouvelles fonctionnalités depuis la 4.0 pour les
-utilisateurs des versions antérieures de Studio.
-
-* Nouvelles touches Assistant SPL, y compris le temps planifier pour la
-  piste (S), durée restante pour la playlist (D) et la température (W si
-  configuré). En outre, pour Studio 5.x, ajouté modification playlist (Y) et
-  hauteur de la piste (Maj+P).
-* Nouvelles commandes Contrôleur SPL, y compris l'avancement  des balayages
-  de la bibliothèque (Maj+R) et l'activation du microphone sans fondu
-  (N). En outre, en appuyant sur F1 il apparaît une boîte de dialogue des
-  commandes disponibles.
-* Lors de l'activation ou la désactivation du microphone via le Contrôleur
-  SPL, des bips seront joué pour indiquer si le statut est activé/désactivé.
-* Les paramètres tels que le temps pour la fin de piste sont enregistrées
-  dans un fichier de configuration dédié dans votre répertoire de
-  configuration utilisateur et sont conservés au cours d'une mises à niveau
-  du module complémentaire (version 4.0 et versions ultérieure).
-* Ajout d'une commande (Alt+NVDA+2) pour définir l'heure de l'allarme
-  chanson intro entre 1 et 9 secondes.
-* Dans les boîtes de dialogue fin de piste et alarme intro, vous pouvez
-  utiliser les flèches haut et bas pour changer les paramètres de
-  l'alarme. Si vous saisissez une valeur erronée, la valeur pour l'alarme
-  est définie à la valeur maximale.
-* Ajout d'une commande (Contrôle+NVDA+4) pour définir une heure lorsque NVDA
-  jouera un son lorsque le microphone est actif depuis un certain temps.
-* Ajouté une fonctionnalité pour annoncer le temps en heures, minutes et
-  secondes (commande non assigné).
-* Il est maintenant possible de suivre le balayage de la bibliothèque depuis
-  la boîte de dialogue Insérer des pistes ou depuis n'importe où et une
-  commande dédiée (NVDA+Alt+R) pour activer/désactiver des options pour
-  l'annonce du balayage de la bibliothèque.
-* Support pour l'Outil de Piste, incluant la lecture d'un bip si une piste
-  intro a été définie et les commandes pour annoncer des informations sur
-  une piste comme la durée et le repère de position.
-* Support pour l'Encodeur StationPlaylist (Studio 5.00 et ultérieure),
-  offrant le même niveau de support comme trouvé dans le support pour
-  l'Encodeur SAM.
-* Dans les fenêtres de l'encodeur, NVDA ne lit plus les tonalités d'erreur
-  lorsque NVDA on lui dit de basculer vers Studio dès la connexion à un
-  serveur de streaming alors que la fenêtre Studio est minimisé.
-* Les erreurs n'on sont plus entendu après la suppression d'un flux avec
-  une étiquette de flux défini sur celui-ci.
-* Il est maintenant possible de contrôler l'introduction et fin de piste via
-  le braille en utilisant les options du minuteur braille (Contrôle+Maj+X).
-* Correction d'un problème où la tentative de basculement vers la fenêtre
-  Studio depuis n'importe quel programme, après que toutes les fenêtres ont
-  été minimisées causé quelque chose d'autre visiblement.
-* Lorsque vous utilisez Studio 5.01 et antérieure, NVDA n'annoncera  pas
-  certaines informations du statut telles que le temps planifié plusieurs
-  fois.
-
-## Changements pour la version 3.5
-
-* Lorsque NVDA démarre ou redémarre alors que la fenêtre principal de la
-  playlist de Studio 5.10 est mis en focus, NVDA ne lira plus les tonalités
-  d'erreur et/ou il ne vas pas annoncer les pistes précédentes et suivantes
-  lorsque vous utiliser les touches fléché à travers les pistes.
-* Correction d'un problème en essayant d'obtenir le temps restant et le
-  temps écoulé pour une piste dans les versions ultérieures  de Studio 5.10.
-* Mises à jour des traductions.
-
-## Changements pour la version 3.4
-
-* Dans l'explorateur de chariot, les chariots impliquant la touche contrôle
-  (par exemple Ctrl+F1) sont maintenant gérées correctement.
-* Mises à jour des traductions.
-
-## Changements pour la version 3.3
-
-* Lors de la connexion à un serveur de streaming en utilisant l'encodeur
-  SAM, il n'est plus nécessaire de rester dans la fenêtre de l'encodeur,
-  jusqu'à ce que la connexion est établie.
-* Correction d'un problème où les commandes de l'encodeur (par exemple,
-  l'étiqueteuse de flux) pourrait ne plus fonctionner lors du passage à la
-  fenêtre SAM provenant d'autres programmes.
-
-## Changements pour la version 3.2
-
-* Ajout d'une commande dans le Contrôleur SPL pour annoncer le temps restant
-  pour la piste en cours de lecture (R).
-* Dans la fenêtre de l'Encodeur SAM, le message lorsque vous êtes en mode
-  aide à la saisie pour la commande Maj+F11 a été corrigée
-* Dans l'Explorateur de Chariot, Si Studio Standard est utilisé, NVDA
-  avertira que les commandes numéros de ligne ne sont pas disponibles pour
-  les assignations de chariot.
-* Dans le Studio 5.10, le chercheur de piste ne lit plus les tonalités
-  d'erreur lors de la recherche à travers les pistes.
-* Traductions nouvelles et mises à jour.
-
-## Changements pour la version 3.1
-
-* Dans la fenêtre de l'Encodeur SAM, ajout d'une commande (Maj+F11) pour
-  dire si Studio lit la première piste lorsqu'il est connecté.
-* Correction de nombreux bugs lors de la connexion à un serveur dans
-  l'Encodeur SAM, dont l'incapacité d'exécuter des commandes NVDA, NVDA
-  n'annonçant pas lorsque la connexion a été établie et des tonalités
-  d'erreur au lieu de bip de connexion étant lu lorsqu'il est connecté.
-
-## Changements pour la version 3.0
-
-* Ajout Explorateur de Chariot pour apprendre les assignations de chariot
-  (jusqu'à 96 chariots peut être assigné).
-* Ajout de nouvelles commandes, y compris le Temps de diffusion
-  (NVDA+Maj+F12) et le Nombre d'auditeurs (i) et le suivant titre de la
-  piste (n) dans l'Assistant SPL.
-* Basculer entre activer/désactiver les messages tels que l'automatisation
-  sont maintenant affichées en braille quelle que soit le paramètre de
-  l'annonce de la bascule.
-* Lorsque la fenêtre de StationPlaylist est minimisé dans la barre d'état
-  système (zone de notification), NVDA annoncera cette action en essayant de
-  basculer vers SPL provenant d'autres programmes.
-* Tonalités d'erreur ils ne sont plus entendue lorsque l'annonce de bascule
-  est défini pour les bips et le statut des messages autre que la bascule
-  entre activer/désactiver sont annoncés (exemple: jouer les chariots).
-* Tonalités d'erreur ils ne sont plus entendue lorsque en essayant d'obtenir
-  des informations telles que le temps restant tandis que l'autre fenêtre de
-  Studio autre que la liste de pistes (par exemple la boîte de dialogue
-  Options) est mis en focus. Si l'information n'est pas trouvée, NVDA
-  annonce cette action.
-* Il est maintenant possible de rechercher une piste par nom
-  d'artiste. Auparavant vous pouvez rechercher par titre de la piste.
-* Support pour l'Encodeur SAM , y compris la possibilité d'étiqueter
-  l'encodeur et une commande de bascule pour commuter au Studio lorsque
-  l'encodeur sélectionné est connecté.
-* L'aide du module complémentaire est disponible à partir du Gestionnaire de
-  modules complémentaires.
-
-## Changements pour la version 2.1
-
-* Correction d'un problème où l'utilisateur était incapable d'obtenir des
-  informations du statut telles que le statut de l'automatisation lorsque
-  SPL 5.x a été lancée pendant l'exécution de NVDA.
-
-## Changements pour la version 2.0
-
-* Certains raccourcis clavier global  et app spécifiques ont été supprimé
-  donc, vous pouvez assigner une commande personnalisée dans la boîte de
-  dialogue Gestes de commandes (module complémentaire version 2.0 requiert
-  NVDA 2013.3 ou version ultérieure).
-* Ajout de plusieurs commandes dans Assistant SPL tels que le statut du mode
-  édition chariot.
-* Vous pouvez maintenant basculer vers SPL Studio même avec toutes les
-  fenêtres minimisées (peut ne pas fonctionner dans certains cas).
-* Augmenté Alarme fin de piste limiter à 59 secondes.
-* Vous pouvez maintenant rechercher une piste dans une playlist
-  (NVDA+Contrôle+F pour trouver, NVDA+F3 ou NVDA+Maj+F3 pour trouver en
-  avant ou en arrière, respectivement).
-* Les noms exacts des zones de liste déroulante sont maintenant annoncés par
-  NVDA (par exemple, boîte de dialogue Options et écrans de configuration
-  initiales SPL).
-* Correction d'un problème où NVDA annonçait des informations erronées en
-  essayant d'obtenir le temps restant pour une piste dans SPL Studio 5.
-
-## Changements pour la version 1.2
-
-* Lorsque Station Playlist 4.x est installé sur certains ordinateurs Windows
-  8/8.1, c'est encore possible d'entendre le temps écoulé et restant pour
-  une piste.
-* Mises à jour des traductions.
-
-## Changements pour la version 1.1
-
-* Ajout d'une commande (contrôle+NVDA+2) pour définir l'heure de l'alarme
-  pour la fin de piste.
-* Correction d'un bug dans le noms du champ pour certains des champs
-  d'édition les quells n'étaient pas annoncé (en particulier les champs
-  d'édition dans la boîte de dialogue Options).
-* Ajout de différentes traductions.
-
-
-## Changements pour la version 1.0
-
-* Première version.
+Please see changelog link for release notes for old add-on releases.
 
 [[!tag dev stable]]
 
@@ -1359,6 +1146,8 @@ utilisateurs des versions antérieures de Studio.
 
 [2]: https://addons.nvda-project.org/files/get.php?file=spl-dev
 
-[3]: http://josephsl.net/files/nvdaaddons/get.php?file=spl-lts16
+[3]: http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-lts16
 
 [4]: https://github.com/josephsl/stationplaylist/wiki/SPLAddonGuide
+
+[5]: https://github.com/josephsl/stationplaylist/wiki/splchangelog

diff --git a/addon/doc/gl/readme.md b/addon/doc/gl/readme.md
index b810ab2..259213e 100644
--- a/addon/doc/gl/readme.md
+++ b/addon/doc/gl/readme.md
@@ -300,6 +300,14 @@ realizar algunhas ordes do Studio dende a pantalla tactil. 
Primeiro usa un
 toque con tgres dedos para cambiar a modo SPL, logo usa as ordes tactiles
 listadas arriba para realizar ordes.
 
+## Version 18.01/15.12-LTS
+
+* When using JAWS layout for SPL Assistant, update check command
+  (Control+Shift+U) now works correctly.
+* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
+  changes such as enabling alarm and changes to microphone alarm interval
+  are applied when closing the dialog.
+
 ## Versión 17.12
 
 * Requírese do indows 7 Service Pack 1 ouposterior.
@@ -1028,219 +1036,9 @@ versión para versións estables.
   cadea, preme Control+F12, logo selecciona a posición do codificador que
   eliminaches).
 
-## Cambios para 4.4/3.9
-
-* A función Library scan agora funciona no Studio 5.10 (require a deradeira
-  compilación do Studio 5.10).
-
-## Cambios para 4.3/3.8
-
-* Cando se cambia a outra parte do Studio como o diálogo insertar pistas
-  mentres cart explorer está activo, NVDA xa non anunciará mesaxes do cart
-  cando as teclas do cart se premen (por exemplo, localizar unha pista dende
-  o diálogo insert tracks).
-* Novas teclas do SPL Assistant, incluíndo o conmutado do anunciado da hora
-  programada e reconto de ouvintes (Shift+S e Shift+I, respectivamente, non
-  se gardan a través de sesións).
-* Ó saír do Studio mentras se abren varios diálogos de alarma , NVDA
-  detectará que se saíu do Studio e non gardará os valores de alarma recén
-  modificados .
-* Traducións actualizadas.
-
-## Cambios para 4.2/3.7
-
-* NVDA xa non esquecerá de reter as etiquetas novas e cambiadas do
-  codificador cando un usuario peche a sesión ou reinicie o computador.
-* Cando a configuración do complemento se corrompe ó se iniciar o NVDA, éste
-  restaurará a configuración predeterminada e amosará unha mensaxe para
-  informar ó usuario deste feito.
-* No complemento 3.7, o problema co foco visto ó eliminar pistas no Studio
-  4.33 correxiuse (a mesma corrección está dispoñible para os usuarios do
-  Studio 5.0x no complemento 4.1).
-
-## Cambios para 4.1
-
-* No Studio 5.0x, eliminando unha pista dende o visualizador principal da
-  lista de reprodución xa non causará que NVDA anuncie a pista de abaixo en
-  lugar da nova enfocada (máis notable se a segunda a última pista fora
-  eliminada, no caso que NVDA dixo "descoñecido").
-* Corexidos varios problemas co escaneado da biblioteca en Studio 5.10,
-  incluíndo o anunciado do número total de elementos na biblioteca mentras
-  se tabula polo diálogo insert tracks e dicindo "O escaneado está en
-  progreso" cando se tenta monitorizar os escaneados da biblioteca a través
-  do SPL Assistant.
-* Cando se utiliza unha pantalla braille co Studio 5.10 e se está marcada
-  unha pista, premendo ESPAZO para marcar unha pista máis abaixo xa non
-  causa que o braille non reflicta o novo estado marcado.
-
-## Cambios para 4.0/3.6
-
-A versión 4.0 soporta SPL Studio 5.00 e posteriores, con 3.x deseñado para
-proporcionar algunhas características novas dende 4.0 para usuarios que
-utilicen versións anteriores de Studio.
-
-* Novas teclas para SPL Assistant, incluíndo tempo programado para a pista
-  (S), duración restante para a lista de reprodución (D) e temperatura (W se
-  se configurou). ademáis, para o Studio 5.x, engadiuse modificación de
-  lista de reprodución (Y) e ton de pista (Shift+P).
-* Novas ordes SPL Controller, incluíndo o progreso dos escaneados da
-  biblioteca (Shift+R) e a habilitación do micrófono sen fade (N). Tamén,
-  premendo F1 desprégase un diálogo amosando as ordes dispoñibles.
-* Cando se habilita ou deshabilita o micrófono a través de SPL Controller,
-  reproduciranse uns pitidos para indicar o estado activado/desactivado.
-* Opcións como tempo de remate de pista gárdanse nun ficheiro de
-  configuración dedicado no teu cartafol de configuración do usuario e
-  presérvanse durante as actualizacións do complemento (versión 4.0 e
-  posteriores).
-* Engadida unha orde (Alt+NVDA+2) para fixar o tempo da alarma da intro da
-  canción entre 1 e 9 segundos.
-* Nos diálogos de alarma de intro e de remate de pista, podes utilizar
-  flechas arriba e abaixo para cambiar as opcións de alarma. Se se introduce
-  un valor erróneo, o valor da alarma fíxase ó máximo valor.
-* Engadida unha orde (Control+NVDA+4) para fixar un tempo no que NVDA
-  reproducirá unha canción cando o micrófono se activara por un intre.
-* Engadida unha característica para anunciar o tempo en horas, minutos e
-  segundos (orde non asignada).
-* Agora é posible seguir os escaneados da biblioteca dende o diálogo Insert
-  Tracks ou dende calquera sitio, unha orden dedicada (Alt+NVDA+R) para
-  conmutar o anunciamento das opcións do escaneado da biblioteca.
-* Soporte para Track Tool, incluíndo a reprodución dun pitido se se unha
-  pista ten unha intro definida e ordes para anunciar información sobre unha
-  pista como a duración e a posición na cola.
-* Soporte para o codificador StationPlaylist (Studio 5.00 e posteiores),
-  proporcionando o mesmo nível de soporte que o atopado no codificador SAM.
-* Nas ventás do codificador, NVDA xa non reproduce tons de erro cando NVDA
-  dixo de cambiar a Studio ó conectarse a un servidor de streaming mentras a
-  ventá do Studio está minimizada.
-* Os erros xa non se escoitan despois de eliminar un stream cunha etiqueta
-  stream fixada neles.
-* Agora é posible monitorizar a introdución e o remate da pista a través do
-  braille utilizando as opcións do temporizador braille (Control+Shift+X).
-* Correxido un problema onde se tenta cambiar á ventá do Studio dende
-  calquera programa despois de que todas as ventás fosen minimizadas
-  causando  que apareza otra cosa.
-* ó utilizar Studio 5.01 e posteiores, NVDA xa non anunciará certa
-  información de estado como o tempo programado múltiples veces.
-
-## Cambios para 3.5
-
-* Cando NVDA se inicie ou reinicie mentras a ventá principal da lista de
-  reprodución do Studio 5.10 estea enfocada, NVDA xa non reproducirá tons de
-  erro e/ou non anunciará a pista seguinte ou a anterior cando se navegue
-  polas pistas.
-* Correxido un problema cando se tenta obter o tempo restante e o tempo
-  transcorrido para unah pista nas compilacións máis recentes do Studio
-  5.10.
-* Traducións actualizadas.
-
-## Cambios para 3.4
-
-* No explorador de cart, os carts involucrados ca tecla control (como
-  Ctrl+F1) agora manéxanse correctamente.
-* Traducións actualizadas.
+## Older releases
 
-## Cambios para 3.3
-
-* Ó se conectar a un servidor de streaming utilizando o codificador SAM, xa
-  non se necesita estar na ventá do codificador ate que a conexión se
-  estableza.
-* Correxido un problema onde as ordes do codificador (por exemplo, stream
-  labeler) xa non funcionaría ó se cambiar á ventá do SAM dende  outros
-  programas.
-
-## Cambios para 3.2
-
-* Engadida unha orde no SPL Controller para informar do tempo restante para
-  a pista actualmente en reprodución (R).
-* Na ventá do codificador SAM, correxiuse a mesaxe do modo axuda de entrada
-  para Shift+F11
-* No explorador de cart, se Studio Standard se está a usar, NVDA alertarache
-  que un número de filas de ordes non están dispoñibles para asignacións de
-  cart.
-* No Studio 5.10, o buscador de pista xa non reproduce tons de erro ó buscar
-  polas pistas.
-* Traducións novas e actualizadas.
-
-## Cambios para 3.1
-
-* Na ventá do SAM Encoder, engadiuse unha orde (Shift+F11) para dicirlle ó
-  Studio que reproduza a primeira pista cando estea conectado.
-* Correxidos numerosos erros cando se conecta a un servidor no Encoder SAM ,
-  incluíndo a incapacidade para levar a cabo as ordes do NVDA , NVDA non
-  anuncia cando a conexión foi establecida e da tons de erro en lugar do
-  pitido de conexión que se está a reproducir cando se conecta .
-
-## Cambios para  3.0
-
-* Engadido explorador de Cart para deprender as asignacións de cart (ate 96
-  carts se poden asignar).
-* Engadidas novas ordes, incluíndo tempo de emisora (NVDA+Shift+F12) e
-  reconto de oubintes (i) e título da seguinte pista (n) no SPL Assistant.
-* Conmutar mesaxes como automation agora amósase en braille
-  independentemente da opción conmutar anunciado.
-* Cando a ventá do StationPlaylist se minimiza á bandexa do sistema (área de
-  notiricacións), NVDA anunciará este feito ó tratar de cambiar a SPL dende
-  outros programas.
-* Os tons de erro xa non se escoitan cando conmutar anunciado está posto en
-  pitidos e as mesaxes de estado que non sexan on/off se anuncian (exemplo:
-  reproducindo carts).
-* Os tons de erro xa non se escoitan cando se tenta obter información como
-  tempo restante mentres outra ventá do Studio que a lista de pistas (como o
-  diálogo Opcións) estea enfocada. Se a información necesaria non se atopa,
-  NVDA anunciará este feito.
-* Agora é posible buscar unha pista polo nome do artista. Con anterioridade
-  podías buscar polo título da pista.
-* Soporte para o codificador SAM, incluíndo a capacidade para etiquetar o
-  codificador e unha orden conmutar para cambiar a Studio cando o
-  codificador seleccionado estea  conectado.
-* A axuda do complemento está dispoñible dende o Administrador de
-  complementos.
-
-## Cambios para 2.1
-
-* Correxido un fallo onde o usuario era incapaz de obter a información de
-  estado como estado de automatización cando SPL 5.x foi lanzado antes de
-  que NVDA estivera en execución.
-
-## Cambios para 2.0
-
-* Elimináronse Algunhas teclas de acceso globais e específicas da aplicación
-  para que poidas asignar un comando personalizado a partir do diálogo
-  Xestos de Entrada (a versión 2.0 do complemento require NVDA 2013.3 ou
-  posterior).
-* Engadidas máis ordes do asistente do SPL tales coma o estado do modo cart
-  edit.
-* Agora podes cambiar ó SPL Studio mesmo con todas as ventás minimizadas
-  (pode non funcionar nalgúns casos).
-* Extendido o rango da alarma de remate da pista a 59 segundos.
-* Agora podes buscar unha pista dunha lista de reprodución (Control+NVDA+F
-  para atopar, NVDA+F3 ou NVDA+Shift+F3 para atopar cara adiante ou cara
-  atrás, respectivamente).
-* anúncianse  nomes correctos das caixas de combinación polo NVDA(por
-  exemplo Do diálogo Opcións e pantallas iniciais de configuración do SPL).
-* Correxido un fallo onde NVDA anunciaba información incorrecta cando
-  tentaba obter o tempo restante para unha pista no SPL Studio 5.
-
-## Cambios para 1.2
-
-* Cando o Station Playlist 4.x está instalado en certos computadores co
-  Windows 8/8.1, é posible novamente escoitar os tempos transcorridos e
-  restantes para unha pista.
-* Traducións actualizadas.
-
-## Cambios para 1.1
-
-* Engade unha orde (Control+NvDA+2) para establecer unha alarma de remate da
-  pista.
-* Correxido un erro no que os nomes de campos para certos campos de edición
-  non se anunciaban (particularmente campos de edición no diálogo de
-  opcións).
-* Engadidas varias traduccións.
-
-
-## Cambios para 1.0
-
-* Versión inicial.
+Please see changelog link for release notes for old add-on releases.
 
 [[!tag dev stable]]
 
@@ -1248,6 +1046,8 @@ utilicen versións anteriores de Studio.
 
 [2]: https://addons.nvda-project.org/files/get.php?file=spl-dev
 
-[3]: http://josephsl.net/files/nvdaaddons/get.php?file=spl-lts16
+[3]: http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-lts16
 
 [4]: https://github.com/josephsl/stationplaylist/wiki/SPLAddonGuide
+
+[5]: https://github.com/josephsl/stationplaylist/wiki/splchangelog


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/e790a1d0321a/
Changeset:   e790a1d0321a
Branch:      None
User:        josephsl
Date:        2017-12-30 06:04:02+00:00
Summary:     Metadata streaming dialog: use a new flag, utilize metadata 
connector, new metadata list. re #44

Because Studio API wrapper is undergoing major redesign, do not pass this 
function object anymore when opening metadata streaming dialog from places 
other than add-on settings. A new flag will replace this object instead.
In splmisc module, add a new metadataList function that'll format metadata 
streaming values as a list for use in various modules and functions.
In metadata dialog, instead of appending to metadata list, build the streams 
list via comprehension. The list will be generated early so it can be assigned 
directly to metadata list in the add-on settings dialog and/or to be passed in 
as list of servers in splmisc.metadataConnector function and applied to current 
broadcast profile if told to do so.

Affected #:  3 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 895a13e..c14e53f 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -1458,8 +1458,9 @@ class AppModule(appModuleHandler.AppModule):
                        wx.CallAfter(gui.messageBox, _("The add-on settings 
dialog or the metadata streaming dialog is opened. Please close the opened 
dialog first."), _("Error"), wx.OK|wx.ICON_ERROR)
                        return
                try:
-                       # Passing in the function object is enough to change 
the dialog UI.
-                       d = splconfui.MetadataStreamingDialog(gui.mainFrame, 
func=studioAPI)
+                       # #44 (18.02): do not rely on Studio API function 
object as its workings (including arguments) may change.
+                       # Use a flag to tell the streaming dialog that this is 
invoked from somewhere other than add-on settings dialog.
+                       d = splconfui.MetadataStreamingDialog(gui.mainFrame, 
configDialogActive=False)
                        gui.mainFrame.prePopup()
                        d.Raise()
                        d.Show()

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index b09197c..f3210e2 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -1100,7 +1100,7 @@ class MetadataStreamingDialog(wx.Dialog):
                        return super(cls, cls).__new__(cls, parent, *args, 
**kwargs)
                return inst
 
-       def __init__(self, parent, func=None):
+       def __init__(self, parent, configDialogActive=True):
                inst = MetadataStreamingDialog._instance() if 
MetadataStreamingDialog._instance else None
                if inst:
                        return
@@ -1109,12 +1109,13 @@ class MetadataStreamingDialog(wx.Dialog):
 
                # Translators: Title of a dialog to configure metadata 
streaming status for DSP encoder and four additional URL's.
                super(MetadataStreamingDialog, self).__init__(parent, 
title=_("Metadata streaming options"))
-               self.func = func
+               # #44 (18.02): Config dialog flag controls how stream value 
will be gathered and set (if true, this is part of add-on settings, otherwise 
use Studio API).
+               self.configDialogActive = configDialogActive
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                metadataSizerHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
                splactions.SPLActionAppTerminating.register(self.onAppTerminate)
 
-               if func is None: labelText=_("Select the URL for metadata 
streaming upon request.")
+               if configDialogActive: labelText=_("Select the URL for metadata 
streaming upon request.")
                else: labelText=_("Check to enable metadata streaming, uncheck 
to disable.")
                metadataSizerHelper.addItem(wx.StaticText(self, 
label=labelText))
 
@@ -1126,13 +1127,15 @@ class MetadataStreamingDialog(wx.Dialog):
                self.checkedStreams = []
                # Add checkboxes for each stream, beginning with the DSP 
encoder.
                sizer = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.HORIZONTAL)
+               import splmisc
+               streams = splmisc.metadataList()
                for stream in xrange(5):
                        
self.checkedStreams.append(sizer.addItem(wx.CheckBox(self, 
label=streamLabels[stream])))
-                       if func: self.checkedStreams[-1].SetValue(func(stream, 
36, ret=True))
+                       if not configDialogActive: 
self.checkedStreams[-1].SetValue(streams[stream])
                        else: 
self.checkedStreams[-1].SetValue(self.Parent.metadataStreams[stream])
                metadataSizerHelper.addItem(sizer.sizer, border = 
gui.guiHelper.BORDER_FOR_DIALOGS, flag=wx.ALL)
 
-               if self.func is not None:
+               if not configDialogActive:
                        # Translators: A checkbox to let metadata streaming 
status be applied to the currently active broadcast profile.
                        self.applyCheckbox = 
metadataSizerHelper.addItem(wx.CheckBox(self, label=_("&Apply streaming changes 
to the selected profile")))
                        self.applyCheckbox.SetValue(True)
@@ -1148,27 +1151,24 @@ class MetadataStreamingDialog(wx.Dialog):
 
        def onOk(self, evt):
                global _metadataDialogOpened
-               if self.func is None: parent = self.Parent
-               metadataEnabled = []
-               for url in xrange(5):
-                       if self.func is None: parent.metadataStreams[url] = 
self.checkedStreams[url].Value
-                       else:
-                               dataLo = 0x00010000 if 
self.checkedStreams[url].Value else 0xffff0000
-                               self.func(dataLo | url, 36)
-                               if self.applyCheckbox.Value: 
metadataEnabled.append(self.checkedStreams[url].Value)
-               if self.func is None:
+               # Prepare checkbox values first for various reasons.
+               metadataEnabled = [self.checkedStreams[url].Value for url in 
xrange(5)]
+               if self.configDialogActive:
+                       parent = self.Parent
+                       parent.metadataStreams = metadataEnabled
                        parent.profiles.SetFocus()
                        parent.Enable()
                else:
+                       import splmisc
+                       splmisc.metadataConnector(servers=metadataEnabled):
                        # 6.1: Store just toggled settings to profile if told 
to do so.
-                       if len(metadataEnabled): 
splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"] = metadataEnabled
+                       if self.applyCheckbox.Value: 
splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"] = metadataEnabled
                self.Destroy()
                _metadataDialogOpened = False
-               return
 
        def onCancel(self, evt):
                global _metadataDialogOpened
-               if self.func is None: self.Parent.Enable()
+               if self.configDialogActive: self.Parent.Enable()
                self.Destroy()
                _metadataDialogOpened = False
 

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 2c12cb1..b452960 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -379,6 +379,11 @@ class SPLCountdownTimer(object):
 
 # Metadata and encoders management, including connection, announcement and so 
on.
 
+# Gather streaming flags into a list.
+def metadataList(handle=None):
+       if handle is None: handle = user32.FindWindowA("SPLStudio", None)
+       return [sendMessage(handle, 1024, pos, 36) for pos in xrange(5)]
+
 # Metadata server connector, to be utilized from many modules.
 # Servers refer to a list of connection flags to pass to Studio API, and if 
not present, will be pulled from add-on settings.
 def metadataConnector(handle=None, servers=None):
@@ -394,12 +399,13 @@ def metadataConnector(handle=None, servers=None):
 # Metadata status formatter.
 def metadataStatus(handle=None):
        if handle is None: handle = user32.FindWindowA("SPLStudio", None)
-       # Gather stream flags.
+       streams = metadataList(handle=handle)
        # DSP is treated specially.
-       dsp = sendMessage(handle, 1024, 0, 36)
+       dsp = streams[0]
        # For others, a simple list.append will do.
        # 17.04: Use a conditional list comprehension.
-       streamCount = [str(pos) for pos in xrange(1, 5) if sendMessage(handle, 
1024, pos, 36)]
+       # 18.02: comprehend based on streams list from above.
+       streamCount = [str(pos) for pos in xrange(1, 5) if streams[pos]]
        # Announce streaming status when told to do so.
        status = None
        if not len(streamCount):


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/5880adb7961c/
Changeset:   5880adb7961c
Branch:      None
User:        josephsl
Date:        2017-12-30 07:21:53+00:00
Summary:     Python 3 compatibility: use a dediated rangeGen compatibility 
function.

Because 2to3 reports xrnage/range ternary as errors, work around this by 
assigning a global rangeGen function to xrange or range for 2 and 3, 
respectively.

Affected #:  6 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index c14e53f..baed4fc 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -42,6 +42,9 @@ import addonHandler
 addonHandler.initTranslation()
 from .spldebugging import debugOutput
 
+# Python 3 preparation (a compatibility layer until Six module is included).
+rangeGen = range if py3 else xrange
+
 # Make sure the broadcaster is running a compatible version.
 SPLMinVersion = "5.10"
 
@@ -129,7 +132,7 @@ class SPLTrackItem(IAccessible):
        def initOverlayClass(self):
                # LTS: Take a greater role in assigning enhanced Columns 
Explorer command at the expense of limiting where this can be invoked.
                # 8.0: Just assign number row.
-               for i in range(10) if py3 else xrange(10):
+               for i in rangeGen(10):
                        self.bindGesture("kb:control+nvda+%s"%(i), 
"columnExplorer")
 
        # Locate the real column index for a column header.
@@ -509,7 +512,7 @@ class ReversedDialog(Dialog):
                textList=[]
                childCount=len(children)
                # For these dialogs, children are arranged in reverse tab order 
(very strange indeed).
-               for index in range(childCount-1, -1, -1) if py3 else 
xrange(childCount-1, -1, -1):
+               for index in rangeGen(childCount-1, -1, -1):
                        child=children[index]
                        childStates=child.states
                        childRole=child.role
@@ -1266,7 +1269,8 @@ class AppModule(appModuleHandler.AppModule):
 
        def buildFNCarts(self):
                # Used xrange, as it is much faster; change this to range if 
NvDA core decides to use Python 3.
-               for i in range(12) if py3 else xrange(12):
+               # 18.02: use rangeGen that'll be assigned to range or xrange 
depending on Python version for now.
+               for i in rangeGen(12):
                        self.bindGesture("kb:f%s"%(i+1), "cartExplorer")
                        self.bindGesture("kb:shift+f%s"%(i+1), "cartExplorer")
                        self.bindGesture("kb:control+f%s"%(i+1), "cartExplorer")
@@ -1516,7 +1520,7 @@ class AppModule(appModuleHandler.AppModule):
                        filename = studioAPI(start, 211, ret=True)
                        totalLength = studioAPI(filename, 30, ret=True)
                else:
-                       for track in range(start, end+1) if py3 else 
xrange(start, end+1):
+                       for track in rangeGen(start, end+1):
                                filename = studioAPI(track, 211, ret=True)
                                totalLength+=studioAPI(filename, 30, ret=True)
                return totalLength
@@ -1732,10 +1736,10 @@ class AppModule(appModuleHandler.AppModule):
                        elif 
splconfig.SPLConfig["Advanced"]["CompatibilityLayer"] == "wineyes": 
self.bindGestures(self.__SPLAssistantWEGestures)
                        # 7.0: Certain commands involving number row.
                        # 8.0: Also assign encoder status commands in addition 
to columns explorer.
-                       for i in range(5) if py3 else xrange(5):
+                       for i in rangeGen(5):
                                self.bindGesture("kb:%s"%(i), "columnExplorer")
                                self.bindGesture("kb:shift+%s"%(i), 
"metadataEnabled")
-                       for i in range(5, 10) if py3 else xrange(5, 10):
+                       for i in rangeGen(5, 10):
                                self.bindGesture("kb:%s"%(i), "columnExplorer")
                        self.SPLAssistant = True
                        tones.beep(512, 50)

diff --git a/addon/appModules/splstudio/splconfig.py 
b/addon/appModules/splstudio/splconfig.py
index 00b9b9d..5b17445 100755
--- a/addon/appModules/splstudio/splconfig.py
+++ b/addon/appModules/splstudio/splconfig.py
@@ -10,16 +10,14 @@ py3 = sys.version.startswith("3")
 import os
 if py3:
        from io import StringIO
+       import pickle
 else:
        from cStringIO import StringIO
+       import cPickle as pickle
 from configobj import ConfigObj
 from validate import Validator
 import time
 import datetime
-if py3:
-       import pickle
-else:
-       import cPickle as pickle
 import globalVars
 import ui
 import gui
@@ -28,6 +26,9 @@ from . import splupdate
 from .splmisc import SPLCountdownTimer, _metadataAnnouncer, _restartMicTimer
 from . import splactions
 
+# Python 3 preparation (a compatibility layer until Six module is included).
+rangeGen = range if py3 else xrange
+
 # Until NVDA Core uses Python 3 (preferably 3.3 or later), use a backported 
version of chain map class.
 # Backported by Jonathan Eunice.
 # Python Package Index: https://pypi.python.org/pypi/chainmap/1.0.2
@@ -686,7 +687,7 @@ def setNextTimedProfile(profile, bits, switchTime, 
date=None, duration=0):
                                delta = currentDay-nextDay
                        else:
                                triggerBit = -1
-                               for bit in range(currentDay-1, -1, -1) if py3 
else xrange(currentDay-1, -1, -1):
+                               for bit in rangeGen(currentDay-1, -1, -1):
                                        if 2 ** bit & days:
                                                triggerBit = bit
                                                break

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index f3210e2..d0ca16f 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -18,6 +18,9 @@ from . import splupdate
 from . import splconfig
 from . import splactions
 
+# Python 3 preparation (a compatibility layer until Six module is included).
+rangeGen = range if py3 else xrange
+
 # Until wx.CENTER_ON_SCREEN returns...
 CENTER_ON_SCREEN = wx.CENTER_ON_SCREEN if hasattr(wx, "CENTER_ON_SCREEN") else 
2
 
@@ -335,7 +338,7 @@ class SPLConfigDialog(gui.SettingsDialog):
 
        # Include profile flags such as instant profile string for display 
purposes.
        def displayProfiles(self, profiles):
-               for index in xrange(len(profiles)):
+               for index in rangeGen(len(profiles)):
                        profiles[index] = 
splconfig.getProfileFlags(profiles[index])
                return profiles
 
@@ -665,7 +668,7 @@ class TriggersDialog(wx.Dialog):
                daysSizer = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, 
_("Day")), wx.HORIZONTAL)
                self.triggerDays = []
                import calendar
-               for day in xrange(len(calendar.day_name)):
+               for day in rangeGen(len(calendar.day_name)):
                        triggerDay=wx.CheckBox(self, 
wx.NewId(),label=calendar.day_name[day])
                        triggerDay.SetValue((64 >> day & 
self.Parent._profileTriggersConfig[profile][0]) if profile in 
self.Parent._profileTriggersConfig else 0)
                        if not self.timeSwitchCheckbox.IsChecked(): 
triggerDay.Disable()
@@ -1129,7 +1132,7 @@ class MetadataStreamingDialog(wx.Dialog):
                sizer = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.HORIZONTAL)
                import splmisc
                streams = splmisc.metadataList()
-               for stream in xrange(5):
+               for stream in rangeGen(5):
                        
self.checkedStreams.append(sizer.addItem(wx.CheckBox(self, 
label=streamLabels[stream])))
                        if not configDialogActive: 
self.checkedStreams[-1].SetValue(streams[stream])
                        else: 
self.checkedStreams[-1].SetValue(self.Parent.metadataStreams[stream])
@@ -1152,7 +1155,7 @@ class MetadataStreamingDialog(wx.Dialog):
        def onOk(self, evt):
                global _metadataDialogOpened
                # Prepare checkbox values first for various reasons.
-               metadataEnabled = [self.checkedStreams[url].Value for url in 
xrange(5)]
+               metadataEnabled = [self.checkedStreams[url].Value for url in 
rangeGen(5)]
                if self.configDialogActive:
                        parent = self.Parent
                        parent.metadataStreams = metadataEnabled
@@ -1160,7 +1163,7 @@ class MetadataStreamingDialog(wx.Dialog):
                        parent.Enable()
                else:
                        import splmisc
-                       splmisc.metadataConnector(servers=metadataEnabled):
+                       splmisc.metadataConnector(servers=metadataEnabled)
                        # 6.1: Store just toggled settings to profile if told 
to do so.
                        if self.applyCheckbox.Value: 
splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"] = metadataEnabled
                self.Destroy()
@@ -1313,7 +1316,7 @@ class ColumnsExplorerDialog(wx.Dialog):
                # 7.0: Studio 5.0x columns.
                # 17.04: Five by two grid layout as 5.0x is no longer supported.
                sizer = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.HORIZONTAL)
-               for slot in xrange(5):
+               for slot in rangeGen(5):
                        # Translators: The label for a setting in SPL add-on 
dialog to select column for this column slot.
                        columns = sizer.addLabeledControl(_("Slot 
{position}").format(position = slot+1), wx.Choice, choices=cols)
                        try:
@@ -1324,7 +1327,7 @@ class ColumnsExplorerDialog(wx.Dialog):
                colExplorerHelper.addItem(sizer.sizer, border = 
gui.guiHelper.BORDER_FOR_DIALOGS, flag=wx.ALL)
 
                sizer = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.HORIZONTAL)
-               for slot in xrange(5, 10):
+               for slot in rangeGen(5, 10):
                        columns = sizer.addLabeledControl(_("Slot 
{position}").format(position = slot+1), wx.Choice, choices=cols)
                        try:
                                
columns.SetSelection(cols.index(parent.exploreColumns[slot] if not tt else 
parent.exploreColumnsTT[slot]))
@@ -1345,7 +1348,7 @@ class ColumnsExplorerDialog(wx.Dialog):
        def onOk(self, evt):
                parent = self.Parent
                slots = parent.exploreColumns if not self.trackTool else 
parent.exploreColumnsTT
-               for slot in xrange(len(self.columnSlots)):
+               for slot in rangeGen(len(self.columnSlots)):
                        slots[slot] = 
self.columnSlots[slot].GetStringSelection()
                parent.profiles.SetFocus()
                parent.Enable()

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index b452960..a8def16 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -6,6 +6,8 @@
 
 # JL's disclaimer: Apart from CSV module, others in this folder are my 
modules. CSV is part of Python distribution (Copyright Python Software 
Foundation).
 
+import sys
+py3 = sys.version.startswith("3")
 import ctypes
 import weakref
 import os
@@ -17,6 +19,9 @@ from winUser import user32, sendMessage
 from .spldebugging import debugOutput
 from . import splactions
 
+# Python 3 preparation (a compatibility layer until Six module is included).
+rangeGen = range if py3 else xrange
+
 # Until wx.CENTER_ON_SCREEN returns...
 CENTER_ON_SCREEN = wx.CENTER_ON_SCREEN if hasattr(wx, "CENTER_ON_SCREEN") else 
2
 
@@ -382,7 +387,7 @@ class SPLCountdownTimer(object):
 # Gather streaming flags into a list.
 def metadataList(handle=None):
        if handle is None: handle = user32.FindWindowA("SPLStudio", None)
-       return [sendMessage(handle, 1024, pos, 36) for pos in xrange(5)]
+       return [sendMessage(handle, 1024, pos, 36) for pos in rangeGen(5)]
 
 # Metadata server connector, to be utilized from many modules.
 # Servers refer to a list of connection flags to pass to Studio API, and if 
not present, will be pulled from add-on settings.
@@ -392,7 +397,7 @@ def metadataConnector(handle=None, servers=None):
        if servers is None:
                from . import splconfig
                servers = 
splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"]
-       for url in xrange(5):
+       for url in rangeGen(5):
                dataLo = 0x00010000 if servers[url] else 0xffff0000
                sendMessage(handle, 1024, dataLo | url, 36)
 
@@ -405,7 +410,7 @@ def metadataStatus(handle=None):
        # For others, a simple list.append will do.
        # 17.04: Use a conditional list comprehension.
        # 18.02: comprehend based on streams list from above.
-       streamCount = [str(pos) for pos in xrange(1, 5) if streams[pos]]
+       streamCount = [str(pos) for pos in rangeGen(1, 5) if streams[pos]]
        # Announce streaming status when told to do so.
        status = None
        if not len(streamCount):

diff --git a/addon/appModules/tracktool.py b/addon/appModules/tracktool.py
index abf1b45..eec31d3 100755
--- a/addon/appModules/tracktool.py
+++ b/addon/appModules/tracktool.py
@@ -14,6 +14,9 @@ from splstudio import splconfig
 from splstudio.splmisc import _getColumnContent
 addonHandler.initTranslation()
 
+# Python 3 preparation (a compatibility layer until Six module is included).
+rangeGen = range if py3 else xrange
+
 # Track Tool allows a broadcaster to manage track intros, cues and so forth. 
Each track is a list item with descriptions such as title, file name, intro 
time and so forth.
 # One can press TAB to move along the controls for Track Tool.
 
@@ -37,7 +40,7 @@ class TrackToolItem(IAccessible):
 
        def initOverlayClass(self):
                # 8.0: Assign Control+NVDA+number row for Columns Explorer just 
like the main app module.
-               for i in range(10) if py3 else xrange(10):
+               for i in rangeGen(10):
                        self.bindGesture("kb:control+nvda+%s"%(i), 
"columnExplorer")
 
        # Tweak for Track Tool: Announce column header if given.

diff --git a/addon/globalPlugins/splUtils/encoders.py 
b/addon/globalPlugins/splUtils/encoders.py
index e0c6b01..54025bd 100755
--- a/addon/globalPlugins/splUtils/encoders.py
+++ b/addon/globalPlugins/splUtils/encoders.py
@@ -416,13 +416,16 @@ class Encoder(IAccessible):
                streamLabels.write()
 
        def script_streamLabelEraser(self, gesture):
+               # Unfortunately, py3 flag must be checked here.
+               import sys
+               choices = [str(pos) for pos in range(1, 
self.simpleParent.childCount)] if sys.version.startswith("3") else [str(pos) 
for pos in xrange(1, self.simpleParent.childCount)]
                # Translators: The title of the stream configuration eraser 
dialog.
                streamEraserTitle = _("Stream label and settings eraser")
                # Translators: The text of the stream configuration eraser 
dialog.
                streamEraserText = _("Enter the position of the encoder you 
wish to delete or will delete")
-               # 17.12: wxPython 4 does not have number entry dialog, so 
replace it with a combo box dialog.
+               # 17.12: wxPython 4 does not have number entry dialog, so 
replace it with a combo box.
                dlg = wx.SingleChoiceDialog(gui.mainFrame,
-               streamEraserText, streamEraserTitle, choices=[str(pos) for pos 
in xrange(1, self.simpleParent.childCount)])
+               streamEraserText, streamEraserTitle, choices=choices)
                dlg.SetSelection(self.IAccessibleChildID-1)
                def callback(result):
                        if result == wx.ID_OK:


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/b2881ebd5a7d/
Changeset:   b2881ebd5a7d
Branch:      None
User:        josephsl
Date:        2017-12-30 09:36:11+00:00
Summary:     Update copyright years

Affected #:  12 files

diff --git a/addon/appModules/splcreator.py b/addon/appModules/splcreator.py
index 31b99da..f177e59 100755
--- a/addon/appModules/splcreator.py
+++ b/addon/appModules/splcreator.py
@@ -1,6 +1,6 @@
 # StationPlaylist Creator
 # An app module and global plugin package for NVDA
-# Copyright 2016-2017 Joseph Lee and others, released under GPL.
+# Copyright 2016-2018 Joseph Lee and others, released under GPL.
 
 # Basic support for StationPlaylist Creator.
 

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index baed4fc..967d736 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -1,6 +1,6 @@
 # StationPlaylist Studio
 # An app module and global plugin package for NVDA
-# Copyright 2011, 2013-2017, Geoff Shang, Joseph Lee and others, released 
under GPL.
+# Copyright 2011, 2013-2018, Geoff Shang, Joseph Lee and others, released 
under GPL.
 # The primary function of this appModule is to provide meaningful feedback to 
users of SplStudio
 # by allowing speaking of items which cannot be easily found.
 # Version 0.01 - 7 April 2011:

diff --git a/addon/appModules/splstudio/splactions.py 
b/addon/appModules/splstudio/splactions.py
index c4480c5..5841cde 100644
--- a/addon/appModules/splstudio/splactions.py
+++ b/addon/appModules/splstudio/splactions.py
@@ -1,6 +1,6 @@
 # SPL Studio Actions
 # An app module and global plugin package for NVDA
-# Copyright 2017 Joseph Lee and others, released under GPL.
+# Copyright 2017-2018 Joseph Lee and others, released under GPL.
 # Defines various actions to be carried out by various add-on modules, powered 
by extension points.
 # This module provides services for other modules, not the other way around.
 # Thus, importing other add-on modules should not be attempted unless granted.

diff --git a/addon/appModules/splstudio/splconfig.py 
b/addon/appModules/splstudio/splconfig.py
index 5b17445..2cb72c3 100755
--- a/addon/appModules/splstudio/splconfig.py
+++ b/addon/appModules/splstudio/splconfig.py
@@ -1,6 +1,6 @@
 # SPL Studio Configuration Manager
 # An app module and global plugin package for NVDA
-# Copyright 2015-2017 Joseph Lee and others, released under GPL.
+# Copyright 2015-2018 Joseph Lee and others, released under GPL.
 # Provides the configuration management package for SPL Studio app module.
 # For miscellaneous dialogs and tool, see SPLMisc module.
 # For UI surrounding this module, see splconfui module.

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index d0ca16f..81b11b6 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -1,6 +1,6 @@
 # SPL Studio Configuration user interfaces
 # An app module and global plugin package for NVDA
-# Copyright 2016-2017 Joseph Lee and others, released under GPL.
+# Copyright 2016-2018 Joseph Lee and others, released under GPL.
 # Split from SPL config module in 2016.
 # Provides the configuration management UI package for SPL Studio app module.
 # For code which provides foundation for code in this module, see splconfig 
module.

diff --git a/addon/appModules/splstudio/spldebugging.py 
b/addon/appModules/splstudio/spldebugging.py
index 43a97d9..c4e2bd3 100755
--- a/addon/appModules/splstudio/spldebugging.py
+++ b/addon/appModules/splstudio/spldebugging.py
@@ -1,6 +1,6 @@
 # SPL Studio add-on debugging framework
 # An app module and global plugin package for NVDA
-# Copyright 2017 Joseph Lee and others, released under GPL.
+# Copyright 2017-2018 Joseph Lee and others, released under GPL.
 # Provides debug output and other diagnostics probes.
 
 from logHandler import log

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index a8def16..571fda4 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -1,6 +1,6 @@
 # SPL Studio Miscellaneous User Interfaces and internal services
 # An app module and global plugin package for NVDA
-# Copyright 2015-2017 Joseph Lee and others, released under GPL.
+# Copyright 2015-2018 Joseph Lee and others, released under GPL.
 # Miscellaneous functions and user interfaces
 # Split from config module in 2015.
 

diff --git a/addon/appModules/splstudio/splupdate.py 
b/addon/appModules/splstudio/splupdate.py
index 6013673..1e7261d 100755
--- a/addon/appModules/splstudio/splupdate.py
+++ b/addon/appModules/splstudio/splupdate.py
@@ -1,6 +1,6 @@
 # StationPlaylist Studio update checker
 # A support module for SPL add-on
-# Copyright 2015-2017 Joseph Lee, released under GPL.
+# Copyright 2015-2018 Joseph Lee, released under GPL.
 
 # Provides update check facility, basics borrowed from NVDA Core's update 
checker class.
 

diff --git a/addon/appModules/tracktool.py b/addon/appModules/tracktool.py
index eec31d3..85207e7 100755
--- a/addon/appModules/tracktool.py
+++ b/addon/appModules/tracktool.py
@@ -1,6 +1,6 @@
 # StationPlaylist Track Tool
 # An app module for NVDA
-# Copyright 2014-2017 Joseph Lee and contributors, released under gPL.
+# Copyright 2014-2018 Joseph Lee and contributors, released under gPL.
 # Functionality is based on JFW scripts for SPL Track Tool by Brian Hartgen.
 
 import sys

diff --git a/addon/globalPlugins/splUtils/__init__.py 
b/addon/globalPlugins/splUtils/__init__.py
index 76ede29..acc58a8 100755
--- a/addon/globalPlugins/splUtils/__init__.py
+++ b/addon/globalPlugins/splUtils/__init__.py
@@ -1,6 +1,6 @@
 # StationPlaylist Utilities
 # Author: Joseph Lee
-# Copyright 2013-2017, released under GPL.
+# Copyright 2013-2018, released under GPL.
 # Adds a few utility features such as switching focus to the SPL Studio window 
and some global scripts.
 # For encoder support, see the encoders package.
 

diff --git a/addon/globalPlugins/splUtils/encoders.py 
b/addon/globalPlugins/splUtils/encoders.py
index 54025bd..afc6722 100755
--- a/addon/globalPlugins/splUtils/encoders.py
+++ b/addon/globalPlugins/splUtils/encoders.py
@@ -1,6 +1,6 @@
 # StationPlaylist encoders support
 # Author: Joseph Lee
-# Copyright 2015-2017, released under GPL.
+# Copyright 2015-2018, released under GPL.
 # Split from main global plugin in 2015.
 
 import threading

diff --git a/addon/installTasks.py b/addon/installTasks.py
index 1b4c17a..8647e44 100755
--- a/addon/installTasks.py
+++ b/addon/installTasks.py
@@ -1,5 +1,5 @@
 # StationPlaylist Studio add-on installation tasks
-# Copyright 2015-2017 Joseph Lee and others, released under GPL.
+# Copyright 2015-2018 Joseph Lee and others, released under GPL.
 
 # Provides needed routines during add-on installation and removal.
 # Routines are partly based on other add-ons, particularly Place Markers by 
Noelia Martinez (thanks add-on authors).


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/8c27a5ce7f4e/
Changeset:   8c27a5ce7f4e
Branch:      None
User:        josephsl
Date:        2017-12-31 05:00:53+00:00
Summary:     Studio API: let the API wrapper return time values which will then 
be passed onto time nanouncer. re #45.

Part of API wrapper redesign: one of the arguments for StudioAPI function is a 
function object. So far, the only time it was used was for time announcements, 
which makes it a dependent argument. From now on, the API wrapper will return 
time value, which will then be fed to time announcer, makng the wrapper more 
independent. Thus, passing a function object in API wrapper is deprecated and 
will be removed in a future commit.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 967d736..6bd3fa2 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -1001,12 +1001,12 @@ class AppModule(appModuleHandler.AppModule):
 
        # Scripts which rely on API.
        def script_sayRemainingTime(self, gesture):
-               if studioIsRunning(): studioAPI(3, 105, self.announceTime, 
offset=1)
+               if studioIsRunning(): self.announceTime(studioAPI(3, 105, 
ret=True), offset=1)
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayRemainingTime.__doc__=_("Announces the remaining track time.")
 
        def script_sayElapsedTime(self, gesture):
-               if studioIsRunning(): studioAPI(0, 105, self.announceTime)
+               if studioIsRunning(): self.announceTime(studioAPI(0, 105, 
ret=True))
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayElapsedTime.__doc__=_("Announces the elapsed time for the 
currently playing track.")
 
@@ -1843,11 +1843,11 @@ class AppModule(appModuleHandler.AppModule):
                        
ui.message(self.status(self.SPLPlayStatus).getChild(5).name)
 
        def script_sayHourTrackDuration(self, gesture):
-               studioAPI(0, 27, self.announceTime)
+               self.announceTime(studioAPI(0, 27, ret=True))
 
        def script_sayHourRemaining(self, gesture):
                # 7.0: Split from playlist remaining script (formerly the 
playlist remainder command).
-               studioAPI(1, 27, self.announceTime)
+               self.announceTime(studioAPI(1, 27, ret=True))
 
        def script_sayPlaylistRemainingDuration(self, gesture):
                obj = api.getFocusObject() if 
api.getForegroundObject().windowClassName == "TStudioForm" else 
self._focusedTrack


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/fe9cae08005f/
Changeset:   fe9cae08005f
Branch:      None
User:        josephsl
Date:        2017-12-31 05:22:27+00:00
Summary:     Studio API wrapper: callback and offset calculation no longer 
possible. Re #45.

Studio API function will now return results only. This means callback isn't 
supported, nor passing offset to the callback function. The only time these two 
were used was in time nanouncer, and offset was used for time offset 
calculation in that method alone.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 6bd3fa2..f10f8f5 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -84,10 +84,10 @@ def micAlarmManager(micAlarmWav, micAlarmMessage):
                
micAlarmT2.Start(splconfig.SPLConfig["MicrophoneAlarm"]["MicAlarmInterval"] * 
1000)
 
 # Use SPL Studio API to obtain needed values.
-# A thin wrapper around user32.SendMessage and calling a callback if defined.
-# Offset is used in some time commands.
+# A thin wrapper around user32.SendMessage function with Studio handle and 
WM_USER supplied.
+# #45 (18.02): returns whatever result SendMessage function says.
 # If debugging framework is on, print arg, command and other values.
-def studioAPI(arg, command, func=None, ret=False, offset=None):
+def studioAPI(arg, command, ret=False):
        if _SPLWin is None:
                debugOutput("Studio handle not found")
                return
@@ -96,8 +96,6 @@ def studioAPI(arg, command, func=None, ret=False, 
offset=None):
        debugOutput("Studio API result is %s"%val)
        if ret:
                return val
-       if func:
-               func(val) if not offset else func(val, offset)
 
 # Check if Studio itself is running.
 # This is to make sure custom commands for SPL Assistant commands and other 
app module gestures display appropriate error messages.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/576fa9cdd2cf/
Changeset:   576fa9cdd2cf
Branch:      None
User:        josephsl
Date:        2017-12-31 17:20:41+00:00
Summary:     Studio API wrapper: return whatever SendMessage function says. Re 
#45.

From now on, Studio API wrapper will return whatever SendMessage function says. 
This means ret flag is deprecated.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index f10f8f5..0c19a62 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -94,8 +94,7 @@ def studioAPI(arg, command, ret=False):
        debugOutput("Studio API wParem is %s, lParem is %s"%(arg, command))
        val = sendMessage(_SPLWin, 1024, arg, command)
        debugOutput("Studio API result is %s"%val)
-       if ret:
-               return val
+       return val
 
 # Check if Studio itself is running.
 # This is to make sure custom commands for SPL Assistant commands and other 
app module gestures display appropriate error messages.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/c4ef75bb4447/
Changeset:   c4ef75bb4447
Branch:      None
User:        josephsl
Date:        2017-12-31 17:29:27+00:00
Summary:     Studio API wrapper: ret flag removed. Re #45.

Retutnr flag from Studio API wrapper is no more. App module fragments that used 
this flag has been modified accordingly, including time ranger finder and 
vairous parts of the Studoi app module.

Affected #:  2 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 0c19a62..252a14d 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -87,7 +87,7 @@ def micAlarmManager(micAlarmWav, micAlarmMessage):
 # A thin wrapper around user32.SendMessage function with Studio handle and 
WM_USER supplied.
 # #45 (18.02): returns whatever result SendMessage function says.
 # If debugging framework is on, print arg, command and other values.
-def studioAPI(arg, command, ret=False):
+def studioAPI(arg, command):
        if _SPLWin is None:
                debugOutput("Studio handle not found")
                return
@@ -193,7 +193,7 @@ class SPLTrackItem(IAccessible):
        # A friendly way to report track position via location text.
        def _get_locationText(self):
                # Translators: location text for a playlist item (example: item 
1 of 10).
-               return _("Item {current} of {total}").format(current = 
self.IAccessibleChildID, total = studioAPI(0, 124, ret=True))
+               return _("Item {current} of {total}").format(current = 
self.IAccessibleChildID, total = studioAPI(0, 124))
 
        # Some helper functions to handle corner cases.
        # Each track item provides its own version.
@@ -998,12 +998,12 @@ class AppModule(appModuleHandler.AppModule):
 
        # Scripts which rely on API.
        def script_sayRemainingTime(self, gesture):
-               if studioIsRunning(): self.announceTime(studioAPI(3, 105, 
ret=True), offset=1)
+               if studioIsRunning(): self.announceTime(studioAPI(3, 105), 
offset=1)
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayRemainingTime.__doc__=_("Announces the remaining track time.")
 
        def script_sayElapsedTime(self, gesture):
-               if studioIsRunning(): self.announceTime(studioAPI(0, 105, 
ret=True))
+               if studioIsRunning(): self.announceTime(studioAPI(0, 105))
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayElapsedTime.__doc__=_("Announces the elapsed time for the 
currently playing track.")
 
@@ -1183,7 +1183,7 @@ class AppModule(appModuleHandler.AppModule):
                                ui.message(_("Time range finder is available 
only in track list."))
                        return False
                # 17.06/15.8-LTS: use Studio API to find out if a playlist is 
even loaded, otherwise Track Finder will fail to notice a playlist.
-               elif api.getForegroundObject().windowClassName == "TStudioForm" 
and not studioAPI(0, 124, ret=True):
+               elif api.getForegroundObject().windowClassName == "TStudioForm" 
and not studioAPI(0, 124):
                        # Translators: Presented when a user wishes to find a 
track but didn't add any tracks.
                        ui.message(_("You need to add at least one track to 
find tracks."))
                        return False
@@ -1365,7 +1365,7 @@ class AppModule(appModuleHandler.AppModule):
                global libScanT
                if libScanT and libScanT.isAlive() and 
api.getForegroundObject().windowClassName == "TTrackInsertForm":
                        return
-               if studioAPI(1, 32, ret=True) < 0:
+               if studioAPI(1, 32) < 0:
                        self.libraryScanning = False
                        return
                time.sleep(0.1)
@@ -1373,10 +1373,10 @@ class AppModule(appModuleHandler.AppModule):
                        self.libraryScanning = False
                        return
                # 17.04: Library scan may have finished while this thread was 
sleeping.
-               if studioAPI(1, 32, ret=True) < 0:
+               if studioAPI(1, 32) < 0:
                        self.libraryScanning = False
                        # Translators: Presented when library scanning is 
finished.
-                       ui.message(_("{itemCount} items in the 
library").format(itemCount = studioAPI(0, 32, ret=True)))
+                       ui.message(_("{itemCount} items in the 
library").format(itemCount = studioAPI(0, 32)))
                else:
                        libScanT = 
threading.Thread(target=self.libraryScanReporter)
                        libScanT.daemon = True
@@ -1385,7 +1385,7 @@ class AppModule(appModuleHandler.AppModule):
        def libraryScanReporter(self):
                scanIter = 0
                # 17.04: Use the constant directly, as 5.10 and later provides 
a convenient method to detect completion of library scans.
-               scanCount = studioAPI(1, 32, ret=True)
+               scanCount = studioAPI(1, 32)
                while scanCount >= 0:
                        if not self.libraryScanning: return
                        time.sleep(1)
@@ -1393,7 +1393,7 @@ class AppModule(appModuleHandler.AppModule):
                        if api.getForegroundObject().windowClassName == 
"TTrackInsertForm" or not self.libraryScanning:
                                return
                        # Scan count may have changed during sleep.
-                       scanCount = studioAPI(1, 32, ret=True)
+                       scanCount = studioAPI(1, 32)
                        if scanCount < 0:
                                break
                        scanIter+=1
@@ -1406,7 +1406,7 @@ class AppModule(appModuleHandler.AppModule):
                                tones.beep(370, 100)
                        else:
                                # Translators: Presented after library scan is 
done.
-                               ui.message(_("Scan complete with {itemCount} 
items").format(itemCount = studioAPI(0, 32, ret=True)))
+                               ui.message(_("Scan complete with {itemCount} 
items").format(itemCount = studioAPI(0, 32)))
 
        # Take care of library scanning announcement.
        def _libraryScanAnnouncer(self, count, announcementType):
@@ -1509,17 +1509,17 @@ class AppModule(appModuleHandler.AppModule):
        # Segue version of this will be used in some places (the below is the 
raw duration).)
        def playlistDurationRaw(self, start, end):
                # Take care of errors such as the following.
-               if start < 0 or end > studioAPI(0, 124, ret=True)-1:
+               if start < 0 or end > studioAPI(0, 124)-1:
                        raise ValueError("Track range start or end position out 
of range")
                        return
                totalLength = 0
                if start == end:
-                       filename = studioAPI(start, 211, ret=True)
-                       totalLength = studioAPI(filename, 30, ret=True)
+                       filename = studioAPI(start, 211)
+                       totalLength = studioAPI(filename, 30)
                else:
                        for track in rangeGen(start, end+1):
-                               filename = studioAPI(track, 211, ret=True)
-                               totalLength+=studioAPI(filename, 30, ret=True)
+                               filename = studioAPI(track, 211)
+                               totalLength+=studioAPI(filename, 30)
                return totalLength
 
        # Playlist snapshots
@@ -1563,7 +1563,7 @@ class AppModule(appModuleHandler.AppModule):
                                totalDuration += (int(hms[-2])*60) + 
int(hms[-1])
                                if len(hms) == 3: totalDuration += 
int(hms[0])*3600
                        obj = obj.next
-               if end is None: snapshot["PlaylistItemCount"] = studioAPI(0, 
124, ret=True)
+               if end is None: snapshot["PlaylistItemCount"] = studioAPI(0, 
124)
                snapshot["PlaylistTrackCount"] = len(artists)
                snapshot["PlaylistDurationTotal"] = 
self._ms2time(totalDuration, ms=False)
                if "DurationMinMax" in snapshotFlags:
@@ -1806,7 +1806,7 @@ class AppModule(appModuleHandler.AppModule):
                if self.SPLCurVersion < "5.20":
                        status = 
self.status(self.SPLPlayStatus).getChild(index).name
                else:
-                       status = 
self._statusBarMessages[index][studioAPI(index, 39, ret=True)]
+                       status = 
self._statusBarMessages[index][studioAPI(index, 39)]
                # #38 (17.11/15.10-LTS): return status text if asked.
                if statusText: return status
                ui.message(status if 
splconfig.SPLConfig["General"]["MessageVerbosity"] == "beginner" else 
status.split()[-1])
@@ -1831,8 +1831,8 @@ class AppModule(appModuleHandler.AppModule):
        def script_sayCartEditStatus(self, gesture):
                # 16.12: Because cart edit status also shows cart insert 
status, verbosity control will not apply.
                if self.productVersion >= "5.20":
-                       cartEdit = studioAPI(5, 39, ret=True)
-                       cartInsert = studioAPI(6, 39, ret=True)
+                       cartEdit = studioAPI(5, 39)
+                       cartInsert = studioAPI(6, 39)
                        if cartEdit: ui.message("Cart Edit On")
                        elif not cartEdit and cartInsert: ui.message("Cart 
Insert On")
                        else: ui.message("Cart Edit Off")
@@ -1840,11 +1840,11 @@ class AppModule(appModuleHandler.AppModule):
                        
ui.message(self.status(self.SPLPlayStatus).getChild(5).name)
 
        def script_sayHourTrackDuration(self, gesture):
-               self.announceTime(studioAPI(0, 27, ret=True))
+               self.announceTime(studioAPI(0, 27))
 
        def script_sayHourRemaining(self, gesture):
                # 7.0: Split from playlist remaining script (formerly the 
playlist remainder command).
-               self.announceTime(studioAPI(1, 27, ret=True))
+               self.announceTime(studioAPI(1, 27))
 
        def script_sayPlaylistRemainingDuration(self, gesture):
                obj = api.getFocusObject() if 
api.getForegroundObject().windowClassName == "TStudioForm" else 
self._focusedTrack
@@ -1853,7 +1853,7 @@ class AppModule(appModuleHandler.AppModule):
                        return
                if obj.role == controlTypes.ROLE_LIST:
                        # 17.09/15.9-LTS: report if no playlist has been loaded.
-                       if not studioAPI(0, 124, ret=True):
+                       if not studioAPI(0, 124):
                                # Translators: reported when no playlist has 
been loaded when trying to obtain remaining time for a playlist.
                                ui.message(_("No playlist has been loaded."))
                                return
@@ -1938,7 +1938,7 @@ class AppModule(appModuleHandler.AppModule):
                # 16.12: use Studio API if using 5.20.
                if self.productVersion >= "5.20":
                        # Sometimes, hour markers return seconds.999 due to 
rounding error, hence this must be taken care of here.
-                       trackStarts = divmod(studioAPI(3, 27, ret=True), 1000)
+                       trackStarts = divmod(studioAPI(3, 27), 1000)
                        # For this method, all three components of time display 
(hour, minute, second) must be present.
                        # In case it is midnight (0.0 but sometimes shown as 
86399.999 due to rounding error), just say "midnight".
                        if trackStarts in ((86399, 999), (0, 0)): 
ui.message("00:00:00")
@@ -1952,7 +1952,7 @@ class AppModule(appModuleHandler.AppModule):
                # 16.12: Use Studio 5.20 API (faster and more reliable).
                if self.productVersion >= "5.20":
                        # This is the only time hour announcement should not be 
used in order to conform to what's displayed on screen.
-                       self.announceTime(studioAPI(4, 27, ret=True), 
includeHours=False)
+                       self.announceTime(studioAPI(4, 27), includeHours=False)
                else:
                        obj = self.status(self.SPLScheduledToPlay).firstChild
                        ui.message(obj.name)
@@ -1974,8 +1974,8 @@ class AppModule(appModuleHandler.AppModule):
 
        def script_libraryScanMonitor(self, gesture):
                if not self.libraryScanning:
-                       if studioAPI(1, 32, ret=True) < 0:
-                               ui.message(_("{itemCount} items in the 
library").format(itemCount = studioAPI(0, 32, ret=True)))
+                       if studioAPI(1, 32) < 0:
+                               ui.message(_("{itemCount} items in the 
library").format(itemCount = studioAPI(0, 32)))
                                return
                        self.libraryScanning = True
                        # Translators: Presented when attempting to start 
library scan.
@@ -1990,7 +1990,7 @@ class AppModule(appModuleHandler.AppModule):
                if self._trackAnalysisAllowed():
                        focus = api.getFocusObject()
                        if focus.role == controlTypes.ROLE_LIST:
-                               if not studioAPI(0, 124, ret=True):
+                               if not studioAPI(0, 124):
                                        # Translators: reported when no 
playlist has been loaded when trying to perform track time analysis.
                                        ui.message(_("No playlist has been 
loaded, cannot perform track time analysis."))
                                        return
@@ -2102,7 +2102,7 @@ class AppModule(appModuleHandler.AppModule):
        # Gesture(s) for the following script cannot be changed by users.
        def script_metadataEnabled(self, gesture):
                url = int(gesture.displayName[-1])
-               if studioAPI(url, 36, ret=True):
+               if studioAPI(url, 36):
                        # 0 is DSP encoder status, others are servers.
                        if url:
                                # Translators: Status message for metadata 
streaming.

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 571fda4..342998e 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -230,8 +230,8 @@ class SPLTimeRangeDialog(wx.Dialog):
                        obj = self.obj.next
                        # Manually locate tracks here.
                        while obj is not None:
-                               filename = self.func(obj.IAccessibleChildID-1, 
211, ret=True)
-                               if minDuration <= self.func(filename, 30, 
ret=True) <= maxDuration:
+                               filename = self.func(obj.IAccessibleChildID-1, 
211)
+                               if minDuration <= self.func(filename, 30) <= 
maxDuration:
                                        break
                                obj = obj.next
                        if obj is not None:


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/01c0466e0141/
Changeset:   01c0466e0141
Branch:      None
User:        josephsl
Date:        2018-01-03 02:29:57+00:00
Summary:     Skip ahead: turned off until needed later

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splupdate.py 
b/addon/appModules/splstudio/splupdate.py
index 1e7261d..e475f2a 100755
--- a/addon/appModules/splstudio/splupdate.py
+++ b/addon/appModules/splstudio/splupdate.py
@@ -86,9 +86,9 @@ def terminate():
 def checkForAddonUpdate():
        updateURL = SPLUpdateURL if SPLUpdateChannel not in channels else 
channels[SPLUpdateChannel]
        # Skip ahead:
-       import versionInfo
-       if SPLUpdateChannel == "try" and (versionInfo.version_year, 
versionInfo.version_major) >= (2017, 4):
-               updateURL = 
"http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-tryahead";
+       #import versionInfo
+       #if SPLUpdateChannel == "try" and (versionInfo.version_year, 
versionInfo.version_major) >= (2017, 4):
+               #updateURL = 
"http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-tryahead";
        # Skip ahead end
        try:
                # Look up the channel if different from the default.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/1e86d8a271f4/
Changeset:   1e86d8a271f4
Branch:      None
User:        josephsl
Date:        2018-01-04 19:39:46+00:00
Summary:     Merge branch 'master' into studioAPI2018

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splupdate.py 
b/addon/appModules/splstudio/splupdate.py
index 1e7261d..e475f2a 100755
--- a/addon/appModules/splstudio/splupdate.py
+++ b/addon/appModules/splstudio/splupdate.py
@@ -86,9 +86,9 @@ def terminate():
 def checkForAddonUpdate():
        updateURL = SPLUpdateURL if SPLUpdateChannel not in channels else 
channels[SPLUpdateChannel]
        # Skip ahead:
-       import versionInfo
-       if SPLUpdateChannel == "try" and (versionInfo.version_year, 
versionInfo.version_major) >= (2017, 4):
-               updateURL = 
"http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-tryahead";
+       #import versionInfo
+       #if SPLUpdateChannel == "try" and (versionInfo.version_year, 
versionInfo.version_major) >= (2017, 4):
+               #updateURL = 
"http://www.josephsl.net/files/nvdaaddons/getupdate.php?file=spl-tryahead";
        # Skip ahead end
        try:
                # Look up the channel if different from the default.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/ffe50e3ee77a/
Changeset:   ffe50e3ee77a
Branch:      None
User:        josephsl
Date:        2018-01-04 19:45:13+00:00
Summary:     Studio API wrapper (18.02): introduce a new splbase module. Re #45.

The SPL base services (splbase) will be used to house common functions and 
constants (and vars) used through Studio app module, mostly having to do with 
Studio API.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splbase.py 
b/addon/appModules/splstudio/splbase.py
new file mode 100644
index 0000000..44fee40
--- /dev/null
+++ b/addon/appModules/splstudio/splbase.py
@@ -0,0 +1,35 @@
+# SPL Studio base services
+# An app module and global plugin package for NVDA
+# Copyright 2018 Joseph Lee and others, released under GPL.
+
+# Base services for Studio app module and support modules
+
+import ui
+from winUser import sendMessage
+from .spldebugging import debugOutput
+
+# Cache the handle to main Studio window.
+_SPLWin = None
+
+# Use SPL Studio API to obtain needed values.
+# A thin wrapper around user32.SendMessage function with Studio handle and 
WM_USER supplied.
+# #45 (18.02): returns whatever result SendMessage function says.
+# If debugging framework is on, print arg, command and other values.
+def studioAPI(arg, command):
+       if _SPLWin is None:
+               debugOutput("Studio handle not found")
+               return
+       debugOutput("Studio API wParem is %s, lParem is %s"%(arg, command))
+       val = sendMessage(_SPLWin, 1024, arg, command)
+       debugOutput("Studio API result is %s"%val)
+       return val
+
+# Check if Studio itself is running.
+# This is to make sure custom commands for SPL Assistant commands and other 
app module gestures display appropriate error messages.
+def studioIsRunning():
+       if _SPLWin is None:
+               debugOutput("Studio handle not found")
+               # Translators: A message informing users that Studio is not 
running so certain commands will not work.
+               ui.message(_("Studio main window not found"))
+               return False
+       return True


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/7a78697aade8/
Changeset:   7a78697aade8
Branch:      None
User:        josephsl
Date:        2018-01-04 20:04:53+00:00
Summary:     Studio API wrapper (18.02): switch to using splbase.studioAPI. Re 
#45.

Now that splbase includes Studio API wrapper, move to using this version 
instead. There are a couple of places where the code refers to the old version, 
but they'll be cleaned up next.

Affected #:  2 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 252a14d..c413d46 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -33,6 +33,7 @@ from NVDAObjects.IAccessible import IAccessible, 
getNVDAObjectFromEvent
 from NVDAObjects.behaviors import Dialog
 import textInfos
 import tones
+from . import splbase
 from . import splconfig
 from . import splconfui
 from . import splmisc
@@ -83,35 +84,6 @@ def micAlarmManager(micAlarmWav, micAlarmMessage):
                micAlarmT2 = wx.PyTimer(_micAlarmAnnouncer)
                
micAlarmT2.Start(splconfig.SPLConfig["MicrophoneAlarm"]["MicAlarmInterval"] * 
1000)
 
-# Use SPL Studio API to obtain needed values.
-# A thin wrapper around user32.SendMessage function with Studio handle and 
WM_USER supplied.
-# #45 (18.02): returns whatever result SendMessage function says.
-# If debugging framework is on, print arg, command and other values.
-def studioAPI(arg, command):
-       if _SPLWin is None:
-               debugOutput("Studio handle not found")
-               return
-       debugOutput("Studio API wParem is %s, lParem is %s"%(arg, command))
-       val = sendMessage(_SPLWin, 1024, arg, command)
-       debugOutput("Studio API result is %s"%val)
-       return val
-
-# Check if Studio itself is running.
-# This is to make sure custom commands for SPL Assistant commands and other 
app module gestures display appropriate error messages.
-def studioIsRunning():
-       if _SPLWin is None:
-               debugOutput("Studio handle not found")
-               # Translators: A message informing users that Studio is not 
running so certain commands will not work.
-               ui.message(_("Studio main window not found"))
-               return False
-       return True
-
-# Select a track upon request.
-def selectTrack(trackIndex):
-       studioAPI(-1, 121)
-       debugOutput("selecting track index %s"%trackIndex)
-       studioAPI(trackIndex, 121)
-
 # Category sounds dictionary (key = category, value = tone pitch).
 _SPLCategoryTones = {
        "Break Note":415,
@@ -193,7 +165,7 @@ class SPLTrackItem(IAccessible):
        # A friendly way to report track position via location text.
        def _get_locationText(self):
                # Translators: location text for a playlist item (example: item 
1 of 10).
-               return _("Item {current} of {total}").format(current = 
self.IAccessibleChildID, total = studioAPI(0, 124))
+               return _("Item {current} of {total}").format(current = 
self.IAccessibleChildID, total = splbase.studioAPI(0, 124))
 
        # Some helper functions to handle corner cases.
        # Each track item provides its own version.
@@ -998,12 +970,12 @@ class AppModule(appModuleHandler.AppModule):
 
        # Scripts which rely on API.
        def script_sayRemainingTime(self, gesture):
-               if studioIsRunning(): self.announceTime(studioAPI(3, 105), 
offset=1)
+               if studioIsRunning(): self.announceTime(splbase.studioAPI(3, 
105), offset=1)
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayRemainingTime.__doc__=_("Announces the remaining track time.")
 
        def script_sayElapsedTime(self, gesture):
-               if studioIsRunning(): self.announceTime(studioAPI(0, 105))
+               if studioIsRunning(): self.announceTime(splbase.studioAPI(0, 
105))
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayElapsedTime.__doc__=_("Announces the elapsed time for the 
currently playing track.")
 
@@ -1183,7 +1155,7 @@ class AppModule(appModuleHandler.AppModule):
                                ui.message(_("Time range finder is available 
only in track list."))
                        return False
                # 17.06/15.8-LTS: use Studio API to find out if a playlist is 
even loaded, otherwise Track Finder will fail to notice a playlist.
-               elif api.getForegroundObject().windowClassName == "TStudioForm" 
and not studioAPI(0, 124):
+               elif api.getForegroundObject().windowClassName == "TStudioForm" 
and not splbase.studioAPI(0, 124):
                        # Translators: Presented when a user wishes to find a 
track but didn't add any tracks.
                        ui.message(_("You need to add at least one track to 
find tracks."))
                        return False
@@ -1365,7 +1337,7 @@ class AppModule(appModuleHandler.AppModule):
                global libScanT
                if libScanT and libScanT.isAlive() and 
api.getForegroundObject().windowClassName == "TTrackInsertForm":
                        return
-               if studioAPI(1, 32) < 0:
+               if splbase.studioAPI(1, 32) < 0:
                        self.libraryScanning = False
                        return
                time.sleep(0.1)
@@ -1373,10 +1345,10 @@ class AppModule(appModuleHandler.AppModule):
                        self.libraryScanning = False
                        return
                # 17.04: Library scan may have finished while this thread was 
sleeping.
-               if studioAPI(1, 32) < 0:
+               if splbase.studioAPI(1, 32) < 0:
                        self.libraryScanning = False
                        # Translators: Presented when library scanning is 
finished.
-                       ui.message(_("{itemCount} items in the 
library").format(itemCount = studioAPI(0, 32)))
+                       ui.message(_("{itemCount} items in the 
library").format(itemCount = splbase.studioAPI(0, 32)))
                else:
                        libScanT = 
threading.Thread(target=self.libraryScanReporter)
                        libScanT.daemon = True
@@ -1385,7 +1357,7 @@ class AppModule(appModuleHandler.AppModule):
        def libraryScanReporter(self):
                scanIter = 0
                # 17.04: Use the constant directly, as 5.10 and later provides 
a convenient method to detect completion of library scans.
-               scanCount = studioAPI(1, 32)
+               scanCount = splbase.studioAPI(1, 32)
                while scanCount >= 0:
                        if not self.libraryScanning: return
                        time.sleep(1)
@@ -1393,7 +1365,7 @@ class AppModule(appModuleHandler.AppModule):
                        if api.getForegroundObject().windowClassName == 
"TTrackInsertForm" or not self.libraryScanning:
                                return
                        # Scan count may have changed during sleep.
-                       scanCount = studioAPI(1, 32)
+                       scanCount = splbase.studioAPI(1, 32)
                        if scanCount < 0:
                                break
                        scanIter+=1
@@ -1406,7 +1378,7 @@ class AppModule(appModuleHandler.AppModule):
                                tones.beep(370, 100)
                        else:
                                # Translators: Presented after library scan is 
done.
-                               ui.message(_("Scan complete with {itemCount} 
items").format(itemCount = studioAPI(0, 32)))
+                               ui.message(_("Scan complete with {itemCount} 
items").format(itemCount = splbase.studioAPI(0, 32)))
 
        # Take care of library scanning announcement.
        def _libraryScanAnnouncer(self, count, announcementType):
@@ -1509,17 +1481,17 @@ class AppModule(appModuleHandler.AppModule):
        # Segue version of this will be used in some places (the below is the 
raw duration).)
        def playlistDurationRaw(self, start, end):
                # Take care of errors such as the following.
-               if start < 0 or end > studioAPI(0, 124)-1:
+               if start < 0 or end > splbase.studioAPI(0, 124)-1:
                        raise ValueError("Track range start or end position out 
of range")
                        return
                totalLength = 0
                if start == end:
-                       filename = studioAPI(start, 211)
-                       totalLength = studioAPI(filename, 30)
+                       filename = splbase.studioAPI(start, 211)
+                       totalLength = splbase.studioAPI(filename, 30)
                else:
                        for track in rangeGen(start, end+1):
-                               filename = studioAPI(track, 211)
-                               totalLength+=studioAPI(filename, 30)
+                               filename = splbase.studioAPI(track, 211)
+                               totalLength+=splbase.studioAPI(filename, 30)
                return totalLength
 
        # Playlist snapshots
@@ -1563,7 +1535,7 @@ class AppModule(appModuleHandler.AppModule):
                                totalDuration += (int(hms[-2])*60) + 
int(hms[-1])
                                if len(hms) == 3: totalDuration += 
int(hms[0])*3600
                        obj = obj.next
-               if end is None: snapshot["PlaylistItemCount"] = studioAPI(0, 
124)
+               if end is None: snapshot["PlaylistItemCount"] = 
splbase.studioAPI(0, 124)
                snapshot["PlaylistTrackCount"] = len(artists)
                snapshot["PlaylistDurationTotal"] = 
self._ms2time(totalDuration, ms=False)
                if "DurationMinMax" in snapshotFlags:
@@ -1806,7 +1778,7 @@ class AppModule(appModuleHandler.AppModule):
                if self.SPLCurVersion < "5.20":
                        status = 
self.status(self.SPLPlayStatus).getChild(index).name
                else:
-                       status = 
self._statusBarMessages[index][studioAPI(index, 39)]
+                       status = 
self._statusBarMessages[index][splbase.studioAPI(index, 39)]
                # #38 (17.11/15.10-LTS): return status text if asked.
                if statusText: return status
                ui.message(status if 
splconfig.SPLConfig["General"]["MessageVerbosity"] == "beginner" else 
status.split()[-1])
@@ -1831,8 +1803,8 @@ class AppModule(appModuleHandler.AppModule):
        def script_sayCartEditStatus(self, gesture):
                # 16.12: Because cart edit status also shows cart insert 
status, verbosity control will not apply.
                if self.productVersion >= "5.20":
-                       cartEdit = studioAPI(5, 39)
-                       cartInsert = studioAPI(6, 39)
+                       cartEdit = splbase.studioAPI(5, 39)
+                       cartInsert = splbase.studioAPI(6, 39)
                        if cartEdit: ui.message("Cart Edit On")
                        elif not cartEdit and cartInsert: ui.message("Cart 
Insert On")
                        else: ui.message("Cart Edit Off")
@@ -1840,11 +1812,11 @@ class AppModule(appModuleHandler.AppModule):
                        
ui.message(self.status(self.SPLPlayStatus).getChild(5).name)
 
        def script_sayHourTrackDuration(self, gesture):
-               self.announceTime(studioAPI(0, 27))
+               self.announceTime(splbase.studioAPI(0, 27))
 
        def script_sayHourRemaining(self, gesture):
                # 7.0: Split from playlist remaining script (formerly the 
playlist remainder command).
-               self.announceTime(studioAPI(1, 27))
+               self.announceTime(splbase.studioAPI(1, 27))
 
        def script_sayPlaylistRemainingDuration(self, gesture):
                obj = api.getFocusObject() if 
api.getForegroundObject().windowClassName == "TStudioForm" else 
self._focusedTrack
@@ -1853,7 +1825,7 @@ class AppModule(appModuleHandler.AppModule):
                        return
                if obj.role == controlTypes.ROLE_LIST:
                        # 17.09/15.9-LTS: report if no playlist has been loaded.
-                       if not studioAPI(0, 124):
+                       if not splbase.studioAPI(0, 124):
                                # Translators: reported when no playlist has 
been loaded when trying to obtain remaining time for a playlist.
                                ui.message(_("No playlist has been loaded."))
                                return
@@ -1938,7 +1910,7 @@ class AppModule(appModuleHandler.AppModule):
                # 16.12: use Studio API if using 5.20.
                if self.productVersion >= "5.20":
                        # Sometimes, hour markers return seconds.999 due to 
rounding error, hence this must be taken care of here.
-                       trackStarts = divmod(studioAPI(3, 27), 1000)
+                       trackStarts = divmod(splbase.studioAPI(3, 27), 1000)
                        # For this method, all three components of time display 
(hour, minute, second) must be present.
                        # In case it is midnight (0.0 but sometimes shown as 
86399.999 due to rounding error), just say "midnight".
                        if trackStarts in ((86399, 999), (0, 0)): 
ui.message("00:00:00")
@@ -1952,7 +1924,7 @@ class AppModule(appModuleHandler.AppModule):
                # 16.12: Use Studio 5.20 API (faster and more reliable).
                if self.productVersion >= "5.20":
                        # This is the only time hour announcement should not be 
used in order to conform to what's displayed on screen.
-                       self.announceTime(studioAPI(4, 27), includeHours=False)
+                       self.announceTime(splbase.studioAPI(4, 27), 
includeHours=False)
                else:
                        obj = self.status(self.SPLScheduledToPlay).firstChild
                        ui.message(obj.name)
@@ -1974,8 +1946,8 @@ class AppModule(appModuleHandler.AppModule):
 
        def script_libraryScanMonitor(self, gesture):
                if not self.libraryScanning:
-                       if studioAPI(1, 32) < 0:
-                               ui.message(_("{itemCount} items in the 
library").format(itemCount = studioAPI(0, 32)))
+                       if splbase.studioAPI(1, 32) < 0:
+                               ui.message(_("{itemCount} items in the 
library").format(itemCount = splbase.studioAPI(0, 32)))
                                return
                        self.libraryScanning = True
                        # Translators: Presented when attempting to start 
library scan.
@@ -1990,7 +1962,7 @@ class AppModule(appModuleHandler.AppModule):
                if self._trackAnalysisAllowed():
                        focus = api.getFocusObject()
                        if focus.role == controlTypes.ROLE_LIST:
-                               if not studioAPI(0, 124):
+                               if not splbase.studioAPI(0, 124):
                                        # Translators: reported when no 
playlist has been loaded when trying to perform track time analysis.
                                        ui.message(_("No playlist has been 
loaded, cannot perform track time analysis."))
                                        return
@@ -2102,7 +2074,7 @@ class AppModule(appModuleHandler.AppModule):
        # Gesture(s) for the following script cannot be changed by users.
        def script_metadataEnabled(self, gesture):
                url = int(gesture.displayName[-1])
-               if studioAPI(url, 36):
+               if splbase.studioAPI(url, 36):
                        # 0 is DSP encoder status, others are servers.
                        if url:
                                # Translators: Status message for metadata 
streaming.

diff --git a/addon/appModules/splstudio/splbase.py 
b/addon/appModules/splstudio/splbase.py
index 44fee40..fbdf297 100644
--- a/addon/appModules/splstudio/splbase.py
+++ b/addon/appModules/splstudio/splbase.py
@@ -33,3 +33,9 @@ def studioIsRunning():
                ui.message(_("Studio main window not found"))
                return False
        return True
+
+# Select a track upon request.
+def selectTrack(trackIndex):
+       studioAPI(-1, 121)
+       debugOutput("selecting track index %s"%trackIndex)
+       studioAPI(trackIndex, 121)


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/33751884e83b/
Changeset:   33751884e83b
Branch:      None
User:        josephsl
Date:        2018-01-04 20:12:53+00:00
Summary:     Time range finder/Studio API wrapper (18.02): call Studio API from 
splbase module when looking for tracks. Re #45.

Instead of passing in StudioAPI function object, let time range finder work 
directly with the wrapper in splbase module. This makes the code look cleaner 
and the dialog less dependent on the function passed in. At the same time, use 
select track function from splbase when a track is found.

Affected #:  2 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index c413d46..8d3ddeb 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -1219,7 +1219,7 @@ class AppModule(appModuleHandler.AppModule):
        def script_timeRangeFinder(self, gesture):
                if self._trackFinderCheck(2):
                        try:
-                               d = splmisc.SPLTimeRangeDialog(gui.mainFrame, 
api.getFocusObject(), studioAPI)
+                               d = splmisc.SPLTimeRangeDialog(gui.mainFrame, 
api.getFocusObject())
                                gui.mainFrame.prePopup()
                                d.Raise()
                                d.Show()

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 342998e..7b9362d 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -16,6 +16,7 @@ import gui
 import wx
 import ui
 from winUser import user32, sendMessage
+from . import splbase
 from .spldebugging import debugOutput
 from . import splactions
 
@@ -159,7 +160,7 @@ class SPLTimeRangeDialog(wx.Dialog):
                        return super(cls, cls).__new__(cls, parent, *args, 
**kwargs)
                return inst
 
-       def __init__(self, parent, obj, func):
+       def __init__(self, parent, obj):
                inst = SPLTimeRangeDialog._instance() if 
SPLTimeRangeDialog._instance else None
                if inst:
                        return
@@ -169,7 +170,6 @@ class SPLTimeRangeDialog(wx.Dialog):
                # Translators: The title of a dialog to find tracks with 
duration within a specified range.
                super(SPLTimeRangeDialog, self).__init__(parent, wx.ID_ANY, 
_("Time range finder"))
                self.obj = obj
-               self.func = func
 
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                splactions.SPLActionAppTerminating.register(self.onAppTerminate)
@@ -230,16 +230,16 @@ class SPLTimeRangeDialog(wx.Dialog):
                        obj = self.obj.next
                        # Manually locate tracks here.
                        while obj is not None:
-                               filename = self.func(obj.IAccessibleChildID-1, 
211)
-                               if minDuration <= self.func(filename, 30) <= 
maxDuration:
+                               filename = 
splbase.studioAPI(obj.IAccessibleChildID-1, 211)
+                               if minDuration <= splbase.studioAPI(filename, 
30) <= maxDuration:
                                        break
                                obj = obj.next
                        if obj is not None:
                                # This time, set focus once, as doing it twice 
causes focus problems only if using Studio 5.10 or later.
                                obj.setFocus()
                                # 16.11: Select the desired track manually.
-                               self.func(-1, 121)
-                               self.func(obj.IAccessibleChildID-1, 121)
+                               # #45 (18.02): call select track function in 
splbase module.
+                               splbase.selectTrack(obj.IAccessibleChildID-1)
                        else:
                                wx.CallAfter(gui.messageBox,
                                # Translators: Standard dialog message when an 
item one wishes to search is not found (copy this from main nvda.po).


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/23f782912cc9/
Changeset:   23f782912cc9
Branch:      None
User:        josephsl
Date:        2018-01-04 22:11:27+00:00
Summary:     Studio API wrapper (18.02): refer to splbase version of Studio 
handle flag.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 8d3ddeb..9626ed5 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -49,9 +49,6 @@ rangeGen = range if py3 else xrange
 # Make sure the broadcaster is running a compatible version.
 SPLMinVersion = "5.10"
 
-# Cache the handle to main Studio window.
-_SPLWin = None
-
 # Threads pool.
 micAlarmT = None
 micAlarmT2 = None
@@ -625,8 +622,7 @@ class AppModule(appModuleHandler.AppModule):
                        hwnd = user32.FindWindowA("SPLStudio", None)
                # Only this thread will have privilege of notifying handle's 
existence.
                with threading.Lock() as hwndNotifier:
-                       global _SPLWin
-                       _SPLWin = hwnd
+                       splbase._SPLWin = hwnd
                        debugOutput("Studio handle is %s"%hwnd)
                # Remind me to broadcast metadata information.
                if splconfig.SPLConfig["General"]["MetadataReminder"] == 
"startup":
@@ -832,7 +828,7 @@ class AppModule(appModuleHandler.AppModule):
        # Respond to profile switches if asked.
        def actionProfileSwitched(self):
                # #38 (17.11/15.10-LTS): obtain microphone alarm status.
-               if _SPLWin is not None: self.doExtraAction(self.sayStatus(2, 
statusText=True))
+               if splbase._SPLWin is not None: 
self.doExtraAction(self.sayStatus(2, statusText=True))
 
        # Alarm announcement: Alarm notification via beeps, speech or both.
        def alarmAnnounce(self, timeText, tone, duration, intro=False):
@@ -924,8 +920,7 @@ class AppModule(appModuleHandler.AppModule):
                # Don't forget to reset timestamps for cart files.
                splmisc._cartEditTimestamps = [0, 0, 0, 0]
                # Just to make sure:
-               global _SPLWin
-               if _SPLWin: _SPLWin = None
+               if splbase._SPLWin: splbase._SPLWin = None
                # 17.10: remove add-on specific command-line switches.
                # This is necessary in order to restore full config 
functionality when NVDA restarts.
                for cmdSwitch in globalVars.appArgsExtra:
@@ -1417,12 +1412,12 @@ class AppModule(appModuleHandler.AppModule):
        # First, the reminder function.
        # 7.0: Calls the module-level version.
        def _metadataAnnouncer(self, reminder=False):
-               splmisc._metadataAnnouncer(reminder=reminder, handle=_SPLWin)
+               splmisc._metadataAnnouncer(reminder=reminder, 
handle=splbase._SPLWin)
 
        # The script version to open the manage metadata URL's dialog.
        def script_manageMetadataStreams(self, gesture):
                # Do not even think about opening this dialog if handle to 
Studio isn't found.
-               if _SPLWin is None:
+               if splbase._SPLWin is None:
                        # Translators: Presented when streaming dialog cannot 
be shown.
                        ui.message(_("Cannot open metadata streaming dialog"))
                        return
@@ -1690,7 +1685,7 @@ class AppModule(appModuleHandler.AppModule):
                        return
                try:
                        # 7.0: Don't bother if handle to Studio isn't found.
-                       if _SPLWin is None:
+                       if splbase._SPLWin is None:
                                # Translators: Presented when SPL Assistant 
cannot be invoked.
                                ui.message(_("Failed to locate Studio main 
window, cannot enter SPL Assistant"))
                                return


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/e17f4511623a/
Changeset:   e17f4511623a
Branch:      None
User:        josephsl
Date:        2018-01-05 18:19:57+00:00
Summary:     Merge branch 'stable'

Affected #:  3 files

diff --git a/addon/doc/es/readme.md b/addon/doc/es/readme.md
index 1a6b5ed..aaaa847 100644
--- a/addon/doc/es/readme.md
+++ b/addon/doc/es/readme.md
@@ -308,13 +308,13 @@ realizar algunas órdenes de Studio desde la pantalla 
táctil. Primero utiliza
 un toque con tres dedos para cambiar a modo SPL, entonces utiliza las
 órdenes táctiles listadas arriba para llevar a cabo tareas.
 
-## Version 18.01/15.12-LTS
+## Versión 18.01/15.12-LTS
 
-* When using JAWS layout for SPL Assistant, update check command
-  (Control+Shift+U) now works correctly.
-* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
-  changes such as enabling alarm and changes to microphone alarm interval
-  are applied when closing the dialog.
+* Al utilizar la distribución de JAWS para SPL Assistant, la orden buscar
+  actualizaciones (Control+Shift+U) ahora funciona correctamente.
+* Al cambiar las opciones de alarma de micrófono a través del diálogo alarma
+  (Alt+NVDA+4), cambios tales como habilitar alarma y cambios al intervalo
+  de alarma de micrófono se aplican cuando se cierre el diálogo.
 
 ## Versión 17.12
 
@@ -1058,9 +1058,10 @@ versión para versiones estables.
   de cadena, pulsa Control+F12, después selecciona la posición del
   codificador que has eliminado).
 
-## Older releases
+## Versiones antiguas
 
-Please see changelog link for release notes for old add-on releases.
+Por favor consulta el enlace changelog para notas de la versión para
+versiones antiguas del complemento.
 
 [[!tag dev stable]]
 

diff --git a/addon/doc/fr/readme.md b/addon/doc/fr/readme.md
index 1395f4f..29aaf13 100644
--- a/addon/doc/fr/readme.md
+++ b/addon/doc/fr/readme.md
@@ -318,11 +318,13 @@ ci-dessus pour exécuter des commandes.
 
 ## Version 18.01/15.12-LTS
 
-* When using JAWS layout for SPL Assistant, update check command
-  (Control+Shift+U) now works correctly.
-* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
-  changes such as enabling alarm and changes to microphone alarm interval
-  are applied when closing the dialog.
+* Lors de l'utilisation de la disposition de JAWS pour l'Assistant SPL, la
+  commande pour rechercher les mises à jour (Contrôle+Maj+U) fonctionne
+  désormais correctement.
+* Lorsque vous modifiez les paramètres alarme microphone via le dialogue
+  alarme (Alt+NVDA+4), des modifications telles que l'activation de l'alarme
+  et la modification de l'intervalle d'alarme sont appliquées à la fermeture
+  du dialogue.
 
 ## Version 17.12
 
@@ -1136,9 +1138,10 @@ year.month pour les publications stable.
   les étiquettes de flux, appuyez sur Contrôle+F12, puis sélectionnez la
   position de l'encodeur, que vous avez supprimé).
 
-## Older releases
+## Anciennes versions
 
-Please see changelog link for release notes for old add-on releases.
+S'il vous plaît voir le lien changelog pour les notes de version  pour les
+anciennes versions du modules complémentaire.
 
 [[!tag dev stable]]
 

diff --git a/addon/doc/gl/readme.md b/addon/doc/gl/readme.md
index 259213e..b52519c 100644
--- a/addon/doc/gl/readme.md
+++ b/addon/doc/gl/readme.md
@@ -300,13 +300,13 @@ realizar algunhas ordes do Studio dende a pantalla 
tactil. Primeiro usa un
 toque con tgres dedos para cambiar a modo SPL, logo usa as ordes tactiles
 listadas arriba para realizar ordes.
 
-## Version 18.01/15.12-LTS
+## Versión 18.01/15.12-LTS
 
-* When using JAWS layout for SPL Assistant, update check command
-  (Control+Shift+U) now works correctly.
-* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
-  changes such as enabling alarm and changes to microphone alarm interval
-  are applied when closing the dialog.
+* Ao se usar a distribución JAWS para SPL Assistant, a orde buscar
+  actualizacións (Control+Shift+U) agora funciona correctamente.
+* Ao se cambiar as opcións de alarma de micrófono a través do diálogo alarma
+  (Alt+NVDA+4), cambios como habilitar alarma e cambios ao intervalo de
+  alarma de micrófono aplícanse cando se peche o diálogo.
 
 ## Versión 17.12
 
@@ -1036,9 +1036,10 @@ versión para versións estables.
   cadea, preme Control+F12, logo selecciona a posición do codificador que
   eliminaches).
 
-## Older releases
+## Versións vellas
 
-Please see changelog link for release notes for old add-on releases.
+Por favor consulta a liga changelog para notas da versión para versións
+vellas do complemento.
 
 [[!tag dev stable]]
 


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/9a12c48308f7/
Changeset:   9a12c48308f7
Branch:      None
User:        josephsl
Date:        2018-01-05 18:20:38+00:00
Summary:     Merge branch 'master' into studioAPI2018

Affected #:  3 files

diff --git a/addon/doc/es/readme.md b/addon/doc/es/readme.md
index 1a6b5ed..aaaa847 100644
--- a/addon/doc/es/readme.md
+++ b/addon/doc/es/readme.md
@@ -308,13 +308,13 @@ realizar algunas órdenes de Studio desde la pantalla 
táctil. Primero utiliza
 un toque con tres dedos para cambiar a modo SPL, entonces utiliza las
 órdenes táctiles listadas arriba para llevar a cabo tareas.
 
-## Version 18.01/15.12-LTS
+## Versión 18.01/15.12-LTS
 
-* When using JAWS layout for SPL Assistant, update check command
-  (Control+Shift+U) now works correctly.
-* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
-  changes such as enabling alarm and changes to microphone alarm interval
-  are applied when closing the dialog.
+* Al utilizar la distribución de JAWS para SPL Assistant, la orden buscar
+  actualizaciones (Control+Shift+U) ahora funciona correctamente.
+* Al cambiar las opciones de alarma de micrófono a través del diálogo alarma
+  (Alt+NVDA+4), cambios tales como habilitar alarma y cambios al intervalo
+  de alarma de micrófono se aplican cuando se cierre el diálogo.
 
 ## Versión 17.12
 
@@ -1058,9 +1058,10 @@ versión para versiones estables.
   de cadena, pulsa Control+F12, después selecciona la posición del
   codificador que has eliminado).
 
-## Older releases
+## Versiones antiguas
 
-Please see changelog link for release notes for old add-on releases.
+Por favor consulta el enlace changelog para notas de la versión para
+versiones antiguas del complemento.
 
 [[!tag dev stable]]
 

diff --git a/addon/doc/fr/readme.md b/addon/doc/fr/readme.md
index 1395f4f..29aaf13 100644
--- a/addon/doc/fr/readme.md
+++ b/addon/doc/fr/readme.md
@@ -318,11 +318,13 @@ ci-dessus pour exécuter des commandes.
 
 ## Version 18.01/15.12-LTS
 
-* When using JAWS layout for SPL Assistant, update check command
-  (Control+Shift+U) now works correctly.
-* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
-  changes such as enabling alarm and changes to microphone alarm interval
-  are applied when closing the dialog.
+* Lors de l'utilisation de la disposition de JAWS pour l'Assistant SPL, la
+  commande pour rechercher les mises à jour (Contrôle+Maj+U) fonctionne
+  désormais correctement.
+* Lorsque vous modifiez les paramètres alarme microphone via le dialogue
+  alarme (Alt+NVDA+4), des modifications telles que l'activation de l'alarme
+  et la modification de l'intervalle d'alarme sont appliquées à la fermeture
+  du dialogue.
 
 ## Version 17.12
 
@@ -1136,9 +1138,10 @@ year.month pour les publications stable.
   les étiquettes de flux, appuyez sur Contrôle+F12, puis sélectionnez la
   position de l'encodeur, que vous avez supprimé).
 
-## Older releases
+## Anciennes versions
 
-Please see changelog link for release notes for old add-on releases.
+S'il vous plaît voir le lien changelog pour les notes de version  pour les
+anciennes versions du modules complémentaire.
 
 [[!tag dev stable]]
 

diff --git a/addon/doc/gl/readme.md b/addon/doc/gl/readme.md
index 259213e..b52519c 100644
--- a/addon/doc/gl/readme.md
+++ b/addon/doc/gl/readme.md
@@ -300,13 +300,13 @@ realizar algunhas ordes do Studio dende a pantalla 
tactil. Primeiro usa un
 toque con tgres dedos para cambiar a modo SPL, logo usa as ordes tactiles
 listadas arriba para realizar ordes.
 
-## Version 18.01/15.12-LTS
+## Versión 18.01/15.12-LTS
 
-* When using JAWS layout for SPL Assistant, update check command
-  (Control+Shift+U) now works correctly.
-* When changing microphone alarm settings via the alarm dialog (Alt+NVDA+4),
-  changes such as enabling alarm and changes to microphone alarm interval
-  are applied when closing the dialog.
+* Ao se usar a distribución JAWS para SPL Assistant, a orde buscar
+  actualizacións (Control+Shift+U) agora funciona correctamente.
+* Ao se cambiar as opcións de alarma de micrófono a través do diálogo alarma
+  (Alt+NVDA+4), cambios como habilitar alarma e cambios ao intervalo de
+  alarma de micrófono aplícanse cando se peche o diálogo.
 
 ## Versión 17.12
 
@@ -1036,9 +1036,10 @@ versión para versións estables.
   cadea, preme Control+F12, logo selecciona a posición do codificador que
   eliminaches).
 
-## Older releases
+## Versións vellas
 
-Please see changelog link for release notes for old add-on releases.
+Por favor consulta a liga changelog para notas da versión para versións
+vellas do complemento.
 
 [[!tag dev stable]]
 


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/858b85e4acfb/
Changeset:   858b85e4acfb
Branch:      None
User:        josephsl
Date:        2018-01-06 06:41:09+00:00
Summary:     Extension points/metadata streaming (18.02): officially move away 
from old metadata announcer code and switch to extension points.

Moving away from old code and to extension points. The handler will now call a 
new internal function that's only job is to announce new metadata streaming 
status. The new internal function will be claled via wx.CallLater, which allows 
other profile switch action handlers to proceed.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 7b9362d..7b45fee 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -430,12 +430,20 @@ def metadataStatus(handle=None):
                else: status = _("Metadata streaming configured for URL's 
{URL}").format(URL = ", ".join(streamCount))
        return status
 
+# Internal metadata status announcer.
+# The idea is to pause for a while and announce the status message and playing 
the accompanying wave file.
+# This is necessary in order to allow extension points to work correctly and 
to not hold up other registered action handlers.
+def _metadataAnnouncerInternal(status):
+       import nvwave, queueHandler, speech
+       speech.cancelSpeech()
+       queueHandler.queueFunction(queueHandler.eventQueue, ui.message, status)
+       nvwave.playWaveFile(os.path.join(os.path.dirname(__file__), 
"SPL_Metadata.wav"))
+
 # Module-level version of metadata announcer
 # Moved to this module in 2016 to allow this function to work while Studio 
window isn't focused.
 # Split into several functions in 2017.
 # To preserve backward compatibility, let the announcer call individual 
functions above for a while.
 def _metadataAnnouncer(reminder=False, handle=None):
-       import time, nvwave, queueHandler, speech
        if handle is None: handle = user32.FindWindowA("SPLStudio", None)
        # If told to remind and connect, metadata streaming will be enabled at 
this time.
        # 6.0: Call Studio API twice - once to set, once more to obtain the 
needed information.
@@ -444,11 +452,8 @@ def _metadataAnnouncer(reminder=False, handle=None):
        if reminder: metadataConnector(handle=handle)
        # Gather stream flags.
        status = metadataStatus(handle=handle)
-       if reminder:
-               time.sleep(2)
-               speech.cancelSpeech()
-               queueHandler.queueFunction(queueHandler.eventQueue, ui.message, 
status)
-               nvwave.playWaveFile(os.path.join(os.path.dirname(__file__), 
"SPL_Metadata.wav"))
+       # #40 (18.02): call the internal announcer in order to not hold up 
action handler queue.
+       if reminder: wx.CallLater(2000, _metadataAnnouncerInternal, status)
        else: ui.message(status)
 
 # Connect and/or announce metadata status when broadcast profile switching 
occurs.
@@ -460,8 +465,17 @@ def 
metadata_actionProfileSwitched(configDialogActive=False):
                
metadataConnector(servers=splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"])
                return
        # Ordinarily, errors would have been dealt with, but Action.notify will 
catch errors and log messages.
+       # #40 (18.02): the only possible error is if Studio handle is invalid, 
which won't be the case, otherwise no point handling this action.
        if splconfig.SPLConfig["General"]["MetadataReminder"] in ("startup", 
"instant"):
-               _metadataAnnouncer(reminder=True)
+               # If told to remind and connect, metadata streaming will be 
enabled at this time.
+               # 6.0: Call Studio API twice - once to set, once more to obtain 
the needed information.
+               # 6.2/7.0: When Studio API is called, add the value into the 
stream count list also.
+               # 17.11: call the connector.
+               # 18.02: transfered to the action handler and greatly 
simplified.
+               handle = user32.FindWindowA("SPLStudio", None)
+               metadataConnector(handle=handle)
+               # #40 (18.02): call the internal announcer in order to not hold 
up action handler queue.
+               wx.CallLater(2000, _metadataAnnouncerInternal, 
metadataStatus(handle=handle))
 
 splactions.SPLActionProfileSwitched.register(metadata_actionProfileSwitched)
 


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/05b39ebf2404/
Changeset:   05b39ebf2404
Branch:      None
User:        josephsl
Date:        2018-01-07 05:16:28+00:00
Summary:     Microphone alarm (18.02): alarm timer will be restarted via the 
mic alarm dialog, not misc module.

Now that extension points will take care of mic alarm timer in the app module 
class, there's no need to call mic timer restarter anymore. This also means the 
only use for it will be microphone alarm dialog, in that the function body has 
been transfered to this dialog.

Affected #:  3 files

diff --git a/addon/appModules/splstudio/splconfig.py 
b/addon/appModules/splstudio/splconfig.py
index 2cb72c3..6845e3e 100755
--- a/addon/appModules/splstudio/splconfig.py
+++ b/addon/appModules/splstudio/splconfig.py
@@ -23,7 +23,7 @@ import ui
 import gui
 import wx
 from . import splupdate
-from .splmisc import SPLCountdownTimer, _metadataAnnouncer, _restartMicTimer
+from .splmisc import SPLCountdownTimer, _metadataAnnouncer
 from . import splactions
 
 # Python 3 preparation (a compatibility layer until Six module is included).
@@ -493,7 +493,6 @@ class ConfigHub(ChainMap):
                        if self["Update"]["AutoUpdateCheck"]: updateInit()
                # #38 (17.11/15.10-LTS): can't wait two seconds for microphone 
alarm to stop.
                # #40 (17.12): all taken care of by profile switched 
notification.
-               _restartMicTimer()
                splactions.SPLActionProfileSwitched.notify()
 
        # Used from config dialog and other places.

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index 81b11b6..9c5c3fa 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -993,8 +993,12 @@ class AlarmsCenter(wx.Dialog):
                                
splconfig.SPLConfig["MicrophoneAlarm"]["MicAlarm"] = 
self.micAlarmEntry.GetValue()
                                
splconfig.SPLConfig["MicrophoneAlarm"]["MicAlarmInterval"] = 
self.micIntervalEntry.GetValue()
                                # #42 (18.01/15.12-LTS): don't forget to 
restart microphone alarm timer.
-                               import splmisc
-                               splmisc._restartMicTimer()
+                               # 18.02: do it here at once.
+                               # It is fine to import something from winUser 
again as this will be traversed if and only if microphone alarm dialog is open 
with Studio active.
+                               from winUser import OBJID_CLIENT
+                               from NVDAObjects.IAccessible import 
getNVDAObjectFromEvent
+                               studioWindow = 
getNVDAObjectFromEvent(user32.FindWindowA("TStudioForm", None), OBJID_CLIENT, 0)
+                               studioWindow.appModule.actionProfileSwitched()
                elif self.level == 0:
                        parent = self.Parent
                        parent.endOfTrackTime = self.outroAlarmEntry.GetValue()

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 7b45fee..cc11708 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -478,13 +478,3 @@ def 
metadata_actionProfileSwitched(configDialogActive=False):
                wx.CallLater(2000, _metadataAnnouncerInternal, 
metadataStatus(handle=handle))
 
 splactions.SPLActionProfileSwitched.register(metadata_actionProfileSwitched)
-
-# Microphone alarm checker.
-# Restart the microphone alarm timer if profile is switched and contains 
different mic alarm values.
-def _restartMicTimer():
-       # The only use of window handle is checking if Studio is running, 
especially if this function is invoked while demo reminder screen is active.
-       if not user32.FindWindowA("SPLStudio", None): return
-       from winUser import OBJID_CLIENT
-       from NVDAObjects.IAccessible import getNVDAObjectFromEvent
-       studioWindow = getNVDAObjectFromEvent(user32.FindWindowA("TStudioForm", 
None), OBJID_CLIENT, 0)
-       studioWindow.appModule.actionProfileSwitched()


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/2ce0415ee36f/
Changeset:   2ce0415ee36f
Branch:      None
User:        josephsl
Date:        2018-01-07 19:26:06+00:00
Summary:     Readme entries for 18.02 work, including metadata streaming 
announcement freeze bug fix

Affected #:  2 files

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index cc11708..04d3de0 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -474,7 +474,7 @@ def 
metadata_actionProfileSwitched(configDialogActive=False):
                # 18.02: transfered to the action handler and greatly 
simplified.
                handle = user32.FindWindowA("SPLStudio", None)
                metadataConnector(handle=handle)
-               # #40 (18.02): call the internal announcer in order to not hold 
up action handler queue.
+               # #47 (18.02/15.13-LTS): call the internal announcer via 
wx.CallLater in order to not hold up action handler queue.
                wx.CallLater(2000, _metadataAnnouncerInternal, 
metadataStatus(handle=handle))
 
 splactions.SPLActionProfileSwitched.register(metadata_actionProfileSwitched)

diff --git a/readme.md b/readme.md
index fb3a5c5..01a69ba 100755
--- a/readme.md
+++ b/readme.md
@@ -181,6 +181,11 @@ From studio window, you can press Alt+NVDA+0 to open the 
add-on configuration di
 
 If you are using Studio on a touchscreen computer running Windows 8 or later 
and have NVDA 2012.3 or later installed, you can perform some Studio commands 
from the touchscreen. First use three finger tap to switch to SPL mode, then 
use the touch commands listed above to perform commands.
 
+## Version 18.02
+
+* Due to internal changes made to support extension points and other features, 
NVDA 2017.4 is required.
+* NVDA will no longer appear to freeze or do nothing when switching to an 
instant switch profile or a time-based profile and NVDA is configured to 
announce metadata streaming status.
+
 ## Version 18.01/15.12-LTS
 
 * When using JAWS layout for SPL Assistant, update check command 
(Control+Shift+U) now works correctly.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/1ffc6f51b228/
Changeset:   1ffc6f51b228
Branch:      None
User:        josephsl
Date:        2018-01-08 04:50:51+00:00
Summary:     Python 3: imports

Affected #:  2 files

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index 9c5c3fa..fcc3a7c 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -1134,7 +1134,7 @@ class MetadataStreamingDialog(wx.Dialog):
                self.checkedStreams = []
                # Add checkboxes for each stream, beginning with the DSP 
encoder.
                sizer = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.HORIZONTAL)
-               import splmisc
+               from . import splmisc
                streams = splmisc.metadataList()
                for stream in rangeGen(5):
                        
self.checkedStreams.append(sizer.addItem(wx.CheckBox(self, 
label=streamLabels[stream])))
@@ -1166,7 +1166,7 @@ class MetadataStreamingDialog(wx.Dialog):
                        parent.profiles.SetFocus()
                        parent.Enable()
                else:
-                       import splmisc
+                       from . import splmisc
                        splmisc.metadataConnector(servers=metadataEnabled)
                        # 6.1: Store just toggled settings to profile if told 
to do so.
                        if self.applyCheckbox.Value: 
splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"] = metadataEnabled

diff --git a/addon/appModules/splstudio/splmisc.py 
b/addon/appModules/splstudio/splmisc.py
index 04d3de0..64be692 100755
--- a/addon/appModules/splstudio/splmisc.py
+++ b/addon/appModules/splstudio/splmisc.py
@@ -459,7 +459,7 @@ def _metadataAnnouncer(reminder=False, handle=None):
 # Connect and/or announce metadata status when broadcast profile switching 
occurs.
 # The config dialog active flag is only invoked when being notified while 
add-on settings dialog is focused.
 def metadata_actionProfileSwitched(configDialogActive=False):
-       import splconfig
+       from . import splconfig
        # Only connect if add-on settings is active in order to avoid wasting 
thread running time.
        if configDialogActive:
                
metadataConnector(servers=splconfig.SPLConfig["MetadataStreaming"]["MetadataEnabled"])


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/2f139ed0c74b/
Changeset:   2f139ed0c74b
Branch:      None
User:        josephsl
Date:        2018-01-08 07:43:50+00:00
Summary:     Add-on update: introduce update flag.

The splupdate.canUpdate flag is used to tell the add-on whether it can update 
itself directly. If it is False, an external entity must update the add-on or 
updating isn't supported.

Affected #:  2 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 9626ed5..ca904b2 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -599,7 +599,7 @@ class AppModule(appModuleHandler.AppModule):
                threading.Thread(target=self._locateSPLHwnd).start()
                # Check for add-on update if told to do so.
                # LTS: Only do this if channel hasn't changed.
-               if splconfig.SPLConfig["Update"]["AutoUpdateCheck"] or 
splupdate._updateNow:
+               if splupdate.canUpdate and 
(splconfig.SPLConfig["Update"]["AutoUpdateCheck"] or splupdate._updateNow):
                        debugOutput("checking for add-on updates from %s 
channel"%splupdate.SPLUpdateChannel)
                        # 7.0: Have a timer call the update function indirectly.
                        import queueHandler

diff --git a/addon/appModules/splstudio/splupdate.py 
b/addon/appModules/splstudio/splupdate.py
index e475f2a..e2e9f06 100755
--- a/addon/appModules/splstudio/splupdate.py
+++ b/addon/appModules/splstudio/splupdate.py
@@ -21,7 +21,12 @@ import gui
 import wx
 import addonHandler
 import globalVars
-import updateCheck
+# There are times when update check should not be supported.
+try:
+       import updateCheck
+       canUpdate = True
+except RuntimeError:
+       canUpdate = False
 
 # Add-on manifest routine (credit: various add-on authors including Noelia 
Martinez).
 # Do not rely on using absolute path to open to manifest, as installation 
directory may change in a future NVDA Core version (highly unlikely, but...).


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/441450906b06/
Changeset:   441450906b06
Branch:      None
User:        josephsl
Date:        2018-01-08 07:45:21+00:00
Summary:     Add-on update: app module constructor will initialize splupdate 
module.

The config initializer will no longer initialize update module to make them 
independent from each other. Instead, the app module constructor will do this.

Affected #:  2 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index ca904b2..4f83454 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -599,6 +599,7 @@ class AppModule(appModuleHandler.AppModule):
                threading.Thread(target=self._locateSPLHwnd).start()
                # Check for add-on update if told to do so.
                # LTS: Only do this if channel hasn't changed.
+               splupdate.initialize()
                if splupdate.canUpdate and 
(splconfig.SPLConfig["Update"]["AutoUpdateCheck"] or splupdate._updateNow):
                        debugOutput("checking for add-on updates from %s 
channel"%splupdate.SPLUpdateChannel)
                        # 7.0: Have a timer call the update function indirectly.

diff --git a/addon/appModules/splstudio/splconfig.py 
b/addon/appModules/splstudio/splconfig.py
index 6845e3e..4b2244d 100755
--- a/addon/appModules/splstudio/splconfig.py
+++ b/addon/appModules/splstudio/splconfig.py
@@ -580,8 +580,6 @@ def initialize():
        # Fire up profile triggers.
        # 17.10: except when normal profile only flag is specified.
        if not SPLConfig.normalProfileOnly: initProfileTriggers()
-       # Let the update check begin.
-       splupdate.initialize()
        # 7.1: Make sure encoder settings map isn't corrupted.
        try:
                streamLabels = 
ConfigObj(os.path.join(globalVars.appArgs.configPath, "splStreamLabels.ini"))


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/e5f1a508c760/
Changeset:   e5f1a508c760
Branch:      None
User:        josephsl
Date:        2018-01-08 09:25:06+00:00
Summary:     Add-on update: a framework to deal with update errors is now 
available.

A set of constants to deal with error conditions:
* 0: no errors.
* 1: generic error (reserved).
* 2: NVDA is in secure mode.
* 3: this is a custom try build.
* 4: NVDA is run from source.
* 5: This is a Windows Store NVDA (no add-on updating supported).
* 6: NVDA has an add-on update feature built in.
* 7: no internet connection.
Of these, 2 through 6 are major errors, so no channel selection, retrys and 
others are not supported under such conditions. These constants are subject to 
change.
To make these error messages friendly, a dictionary to store error constants 
and user friendly messages is used to convey error information.
A new splupdate.canUpdate function has been added, which is a convenience 
method to check splupdate.IsAddonUpdatingSupported function and checking if the 
result is 0 (no errors). For the most part, this convenience function will not 
be used except for background update checking.

Affected #:  2 files

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 4f83454..4bf8bc2 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -600,7 +600,7 @@ class AppModule(appModuleHandler.AppModule):
                # Check for add-on update if told to do so.
                # LTS: Only do this if channel hasn't changed.
                splupdate.initialize()
-               if splupdate.canUpdate and 
(splconfig.SPLConfig["Update"]["AutoUpdateCheck"] or splupdate._updateNow):
+               if splupdate.canUpdate() and 
(splconfig.SPLConfig["Update"]["AutoUpdateCheck"] or splupdate._updateNow):
                        debugOutput("checking for add-on updates from %s 
channel"%splupdate.SPLUpdateChannel)
                        # 7.0: Have a timer call the update function indirectly.
                        import queueHandler

diff --git a/addon/appModules/splstudio/splupdate.py 
b/addon/appModules/splstudio/splupdate.py
index e2e9f06..2050a84 100755
--- a/addon/appModules/splstudio/splupdate.py
+++ b/addon/appModules/splstudio/splupdate.py
@@ -24,9 +24,8 @@ import globalVars
 # There are times when update check should not be supported.
 try:
        import updateCheck
-       canUpdate = True
 except RuntimeError:
-       canUpdate = False
+       pass
 
 # Add-on manifest routine (credit: various add-on authors including Noelia 
Martinez).
 # Do not rely on using absolute path to open to manifest, as installation 
directory may change in a future NVDA Core version (highly unlikely, but...).
@@ -88,6 +87,56 @@ def terminate():
                pickle.dump(SPLAddonState, file(_updatePickle, "wb"))
        SPLAddonState = None
 
+SPLUpdateErrorNone = 0
+SPLUpdateErrorGeneric = 1
+SPLUpdateErrorSecureMode = 2
+SPLUpdateErrorTryBuild = 3
+SPLUpdateErrorSource = 4
+SPLUpdateErrorAppx = 5
+SPLUpdateErrorAddonsManagerUpdate = 6
+SPLUpdateErrorNoNetConnection = 7
+
+# These conditions are set when NVDA starts and cannot be changed at runtime, 
hence major errors.
+# This means no update channel selection, no retrys, etc.
+SPLUpdateMajorErrors = (SPLUpdateErrorSecureMode, SPLUpdateErrorTryBuild, 
SPLUpdateErrorSource, SPLUpdateErrorAppx, SPLUpdateErrorAddonsManagerUpdate)
+
+updateErrorMessages={
+       SPLUpdateErrorGeneric: _("An unexpected error occured. Please check 
NVDA log for details."),
+       SPLUpdateErrorSecureMode: _("NVDA is in secure mode. Please restart 
with secure mode disabled before checking for add-on updates."),
+       SPLUpdateErrorTryBuild: _("This is a try build of StationPlaylist 
Studio add-on. Please install the latest stable release to receive updates 
again."),
+       SPLUpdateErrorSource: _("Update checking not supported while running 
NVDA from source. Please run this add-on from an installed or a portable 
version of NVDA."),
+       SPLUpdateErrorAppx: _("This is a Windows Store version of NVDA. Add-on 
updating is supported on desktop version of NVDA."),
+       SPLUpdateErrorAddonsManagerUpdate: _("Cannot update add-on directly. 
Please check for add-on updates by going to add-ons manager."),
+       SPLUpdateErrorNoNetConnection: _("No internet connection. Please 
connect to the internet before checking for add-on update."),
+}
+
+# Only applicable for custom try builds.
+_customTryBuild = False
+
+# Check to really make sure add-on updating is supported.
+# Contrary to its name, 0 means yes, otherwise no.
+# For most cases, it'll return no errors except for scenarios outlined below.
+# The generic error (1) is meant to catch all errors not listed here, and for 
now, not used.
+def isAddonUpdatingSupported():
+       if globalVars.appArgs.secure:
+               return SPLUpdateErrorSecureMode
+       if _customTryBuild:
+               return SPLUpdateErrorTryBuild
+       import versionInfo
+       if not versionInfo.updateVersionType:
+               return SPLUpdateErrorSource
+       # NVDA 2018.1 and later.
+       import config
+       if hasattr(config, "isAppX") and config.isAppX:
+               return SPLUpdateErrorAppx
+       # Provided that NVDA issue 3208 is implemented.
+       if hasattr(addonHandler, "checkForAddonUpdate"):
+               return SPLUpdateErrorAddonsManagerUpdate
+       return SPLUpdateErrorNone
+
+def canUpdate():
+       return isAddonUpdatingSupported() == SPLUpdateErrorNone
+
 def checkForAddonUpdate():
        updateURL = SPLUpdateURL if SPLUpdateChannel not in channels else 
channels[SPLUpdateChannel]
        # Skip ahead:


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/d164151c0102/
Changeset:   d164151c0102
Branch:      None
User:        josephsl
Date:        2018-01-08 21:47:22+00:00
Summary:     Studio API wrapper (18.02): studio is runing function is part of 
splbase.

Reported by a broadcaster: elapsed time and remaining time scripts doesn't 
work. Turns out studioIsRunning function is to blame, in that the module 
qualifier (splbase) wasn't specified, causing name error exception.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 9626ed5..bdd544d 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -965,17 +965,17 @@ class AppModule(appModuleHandler.AppModule):
 
        # Scripts which rely on API.
        def script_sayRemainingTime(self, gesture):
-               if studioIsRunning(): self.announceTime(splbase.studioAPI(3, 
105), offset=1)
+               if splbase.studioIsRunning(): 
self.announceTime(splbase.studioAPI(3, 105), offset=1)
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayRemainingTime.__doc__=_("Announces the remaining track time.")
 
        def script_sayElapsedTime(self, gesture):
-               if studioIsRunning(): self.announceTime(splbase.studioAPI(0, 
105))
+               if splbase.studioIsRunning(): 
self.announceTime(splbase.studioAPI(0, 105))
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayElapsedTime.__doc__=_("Announces the elapsed time for the 
currently playing track.")
 
        def script_sayBroadcasterTime(self, gesture):
-               if not studioIsRunning(): return
+               if not splbase.studioIsRunning(): return
                # Says things such as "25 minutes to 2" and "5 past 11".
                # #29: Also announces top of hour timer (mm:ss), the clock next 
to broadcaster time.
                # Parse the local time and say it similar to how Studio 
presents broadcaster time.
@@ -1003,7 +1003,7 @@ class AppModule(appModuleHandler.AppModule):
        script_sayBroadcasterTime.__doc__=_("Announces broadcaster time. If 
pressed twice, reports minutes and seconds left to top of the hour.")
 
        def script_sayCompleteTime(self, gesture):
-               if not studioIsRunning(): return
+               if not splbase.studioIsRunning(): return
                import winKernel
                # Says complete time in hours, minutes and seconds via 
kernel32's routines.
                
ui.message(winKernel.GetTimeFormat(winKernel.LOCALE_USER_DEFAULT, 0, None, 
None))
@@ -1137,7 +1137,7 @@ class AppModule(appModuleHandler.AppModule):
        # But first, check if track finder can be invoked.
        # Attempt level specifies which track finder to open (0 = Track Finder, 
1 = Column Search, 2 = Time range).
        def _trackFinderCheck(self, attemptLevel):
-               if not studioIsRunning(): return False
+               if not splbase.studioIsRunning(): return False
                if api.getForegroundObject().windowClassName != "TStudioForm":
                        if attemptLevel == 0:
                                # Translators: Presented when a user attempts 
to find tracks but is not at the track list.
@@ -1258,7 +1258,7 @@ class AppModule(appModuleHandler.AppModule):
                        self.bindGestures(self.__gestures)
 
        def script_toggleCartExplorer(self, gesture):
-               if not studioIsRunning(): return
+               if not splbase.studioIsRunning(): return
                if not self.cartExplorer:
                        # Prevent cart explorer from being engaged outside of 
playlist viewer.
                        # Todo for 6.0: Let users set cart banks.
@@ -1447,7 +1447,7 @@ class AppModule(appModuleHandler.AppModule):
 
        # Trakc time analysis and playlist snapshots require main playlist 
viewer to be the foreground window.
        def _trackAnalysisAllowed(self):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        return False
                if api.getForegroundObject().windowClassName != "TStudioForm":
                        # Translators: Presented when track time analysis 
and/or playlist snapshot gathering cannot be performed because user is not 
focused on playlist viewer.
@@ -1837,7 +1837,7 @@ class AppModule(appModuleHandler.AppModule):
                        ui.message(_("Playlist modification not available"))
 
        def script_sayNextTrackTitle(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                try:
@@ -1859,7 +1859,7 @@ class AppModule(appModuleHandler.AppModule):
        script_sayNextTrackTitle.__doc__=_("Announces title of the next track 
if any")
 
        def script_sayCurrentTrackTitle(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                try:
@@ -1881,7 +1881,7 @@ class AppModule(appModuleHandler.AppModule):
        script_sayCurrentTrackTitle.__doc__=_("Announces title of the currently 
playing track")
 
        def script_sayTemperature(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                try:
@@ -2001,7 +2001,7 @@ class AppModule(appModuleHandler.AppModule):
        script_trackTimeAnalysis.__doc__=_("Announces total length of tracks 
between analysis start marker and the current track")
 
        def script_takePlaylistSnapshots(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                obj = api.getFocusObject() if 
api.getForegroundObject().windowClassName == "TStudioForm" else 
self._focusedTrack


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/c20684fcbca8/
Changeset:   c20684fcbca8
Branch:      None
User:        josephsl
Date:        2018-01-09 02:53:25+00:00
Summary:     Merge branch 'master' into splupdate

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 4bf8bc2..81f2d73 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -966,17 +966,17 @@ class AppModule(appModuleHandler.AppModule):
 
        # Scripts which rely on API.
        def script_sayRemainingTime(self, gesture):
-               if studioIsRunning(): self.announceTime(splbase.studioAPI(3, 
105), offset=1)
+               if splbase.studioIsRunning(): 
self.announceTime(splbase.studioAPI(3, 105), offset=1)
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayRemainingTime.__doc__=_("Announces the remaining track time.")
 
        def script_sayElapsedTime(self, gesture):
-               if studioIsRunning(): self.announceTime(splbase.studioAPI(0, 
105))
+               if splbase.studioIsRunning(): 
self.announceTime(splbase.studioAPI(0, 105))
        # Translators: Input help mode message for a command in Station 
Playlist Studio.
        script_sayElapsedTime.__doc__=_("Announces the elapsed time for the 
currently playing track.")
 
        def script_sayBroadcasterTime(self, gesture):
-               if not studioIsRunning(): return
+               if not splbase.studioIsRunning(): return
                # Says things such as "25 minutes to 2" and "5 past 11".
                # #29: Also announces top of hour timer (mm:ss), the clock next 
to broadcaster time.
                # Parse the local time and say it similar to how Studio 
presents broadcaster time.
@@ -1004,7 +1004,7 @@ class AppModule(appModuleHandler.AppModule):
        script_sayBroadcasterTime.__doc__=_("Announces broadcaster time. If 
pressed twice, reports minutes and seconds left to top of the hour.")
 
        def script_sayCompleteTime(self, gesture):
-               if not studioIsRunning(): return
+               if not splbase.studioIsRunning(): return
                import winKernel
                # Says complete time in hours, minutes and seconds via 
kernel32's routines.
                
ui.message(winKernel.GetTimeFormat(winKernel.LOCALE_USER_DEFAULT, 0, None, 
None))
@@ -1138,7 +1138,7 @@ class AppModule(appModuleHandler.AppModule):
        # But first, check if track finder can be invoked.
        # Attempt level specifies which track finder to open (0 = Track Finder, 
1 = Column Search, 2 = Time range).
        def _trackFinderCheck(self, attemptLevel):
-               if not studioIsRunning(): return False
+               if not splbase.studioIsRunning(): return False
                if api.getForegroundObject().windowClassName != "TStudioForm":
                        if attemptLevel == 0:
                                # Translators: Presented when a user attempts 
to find tracks but is not at the track list.
@@ -1259,7 +1259,7 @@ class AppModule(appModuleHandler.AppModule):
                        self.bindGestures(self.__gestures)
 
        def script_toggleCartExplorer(self, gesture):
-               if not studioIsRunning(): return
+               if not splbase.studioIsRunning(): return
                if not self.cartExplorer:
                        # Prevent cart explorer from being engaged outside of 
playlist viewer.
                        # Todo for 6.0: Let users set cart banks.
@@ -1448,7 +1448,7 @@ class AppModule(appModuleHandler.AppModule):
 
        # Trakc time analysis and playlist snapshots require main playlist 
viewer to be the foreground window.
        def _trackAnalysisAllowed(self):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        return False
                if api.getForegroundObject().windowClassName != "TStudioForm":
                        # Translators: Presented when track time analysis 
and/or playlist snapshot gathering cannot be performed because user is not 
focused on playlist viewer.
@@ -1838,7 +1838,7 @@ class AppModule(appModuleHandler.AppModule):
                        ui.message(_("Playlist modification not available"))
 
        def script_sayNextTrackTitle(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                try:
@@ -1860,7 +1860,7 @@ class AppModule(appModuleHandler.AppModule):
        script_sayNextTrackTitle.__doc__=_("Announces title of the next track 
if any")
 
        def script_sayCurrentTrackTitle(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                try:
@@ -1882,7 +1882,7 @@ class AppModule(appModuleHandler.AppModule):
        script_sayCurrentTrackTitle.__doc__=_("Announces title of the currently 
playing track")
 
        def script_sayTemperature(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                try:
@@ -2002,7 +2002,7 @@ class AppModule(appModuleHandler.AppModule):
        script_trackTimeAnalysis.__doc__=_("Announces total length of tracks 
between analysis start marker and the current track")
 
        def script_takePlaylistSnapshots(self, gesture):
-               if not studioIsRunning():
+               if not splbase.studioIsRunning():
                        self.finish()
                        return
                obj = api.getFocusObject() if 
api.getForegroundObject().windowClassName == "TStudioForm" else 
self._focusedTrack


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/a998fa114dc0/
Changeset:   a998fa114dc0
Branch:      None
User:        josephsl
Date:        2018-01-09 21:05:36+00:00
Summary:     Update check: detect and presetn update blocker error messages 
when chekcing for updates manually.

When checking for updates manually (SPL Assistant, Control+Shift+U), first 
check if updating is supported. If it isn't, present an error message coming 
from update errors map.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index 81f2d73..be11a9b 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -2112,6 +2112,12 @@ class AppModule(appModuleHandler.AppModule):
 
        def script_updateCheck(self, gesture):
                self.finish()
+               # #46 and others (18.02): there are times when update checking 
isn't supported such as when running inside Windows Store version of NVDA.
+               # Detect various errors and present appropriate messages and 
quit immediately.
+               updateBlocker = splupdate.isAddonUpdatingSupported()
+               if updateBlocker != splupdate.SPLUpdateErrorNone:
+                       wx.CallAfter(gui.messageBox, 
splupdate.updateErrorMessages[updateBlocker], _("Studio add-on update"), 
wx.ICON_ERROR)
+                       return
                if splupdate._SPLUpdateT is not None and 
splupdate._SPLUpdateT.IsRunning(): splupdate._SPLUpdateT.Stop()
                # Display the update check progress dialog (inspired by add-on 
installation dialog in NvDA Core).
                # #9 (7.5): Do this if and only if update channel hasn't 
changed, otherwise we're stuck here forever.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/1af44101de41/
Changeset:   1af44101de41
Branch:      None
User:        josephsl
Date:        2018-01-11 05:07:55+00:00
Summary:     Update check (18.02/15.13-LTS): provide a more generic error 
message if things other than known errors occur.

If a generic error occurs, the best thing to do is telling users to look up the 
log viewer. Thankfully, a message already exists to deal with this one, so use 
this instead of the custom message used until now.
Also, when generic error occurs, print the resulting traceback no matter what 
log level one is using (log.error not log.debugWarning).
This will be backported to 15.x LTS.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splupdate.py 
b/addon/appModules/splstudio/splupdate.py
index 2050a84..5bf722f 100755
--- a/addon/appModules/splstudio/splupdate.py
+++ b/addon/appModules/splstudio/splupdate.py
@@ -101,7 +101,7 @@ SPLUpdateErrorNoNetConnection = 7
 SPLUpdateMajorErrors = (SPLUpdateErrorSecureMode, SPLUpdateErrorTryBuild, 
SPLUpdateErrorSource, SPLUpdateErrorAppx, SPLUpdateErrorAddonsManagerUpdate)
 
 updateErrorMessages={
-       SPLUpdateErrorGeneric: _("An unexpected error occured. Please check 
NVDA log for details."),
+       SPLUpdateErrorGeneric: _("An error occured while checking for add-on 
update. Please check NVDA log for details."),
        SPLUpdateErrorSecureMode: _("NVDA is in secure mode. Please restart 
with secure mode disabled before checking for add-on updates."),
        SPLUpdateErrorTryBuild: _("This is a try build of StationPlaylist 
Studio add-on. Please install the latest stable release to receive updates 
again."),
        SPLUpdateErrorSource: _("Update checking not supported while running 
NVDA from source. Please run this add-on from an installed or a portable 
version of NVDA."),
@@ -194,13 +194,12 @@ def updateChecker(auto=False, continuous=False, 
confUpdateInterval=1):
        try:
                info = checkForAddonUpdate()
        except:
-               log.debugWarning("Error checking for update", exc_info=True)
+               log.error("Error checking for update", exc_info=True)
                _retryAfterFailure = True
                if not auto:
                        wx.CallAfter(_progressDialog.done)
                        _progressDialog = None
-                       # Translators: Error text shown when add-on update 
check fails.
-                       wx.CallAfter(gui.messageBox, _("Error checking for 
update."), _("Studio add-on update"), wx.ICON_ERROR)
+                       wx.CallAfter(gui.messageBox, 
updateErrorMessages[SPLUpdateErrorGeneric], _("Studio add-on update"), 
wx.ICON_ERROR)
                if continuous: _SPLUpdateT.Start(600000, True)
                return
        if _retryAfterFailure:


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/4352d62ae859/
Changeset:   4352d62ae859
Branch:      None
User:        josephsl
Date:        2018-01-11 06:03:03+00:00
Summary:     Update check (18.02/15.13-LTS): do not run update check timer if 
NVDA's secure mode flag is on. re #48.

Security: despite secure mode flag being on, update check continues, 
potentially introducing multiple problems, including man in the middle (MITM) 
and data read errors and others, as well as contradicting ideal security 
experience. This is especially the csae when automatic update check timer is in 
use. Therefore turn this timer off if NVDA's secure mode flag is on.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splconfig.py 
b/addon/appModules/splstudio/splconfig.py
index 4b2244d..2b16556 100755
--- a/addon/appModules/splstudio/splconfig.py
+++ b/addon/appModules/splstudio/splconfig.py
@@ -931,13 +931,16 @@ def triggerProfileSwitch():
 
 # The function below is called as part of the update check timer.
 # Its only job is to call the update check function (splupdate) with the auto 
check enabled.
-# The update checker will not be engaged if an instant switch profile is 
active or it is not time to check for it yet (check will be done every 24 
hours).
+# The update checker will not be engaged if secure mode flag is on, an instant 
switch profile is active, or it is not time to check for it yet (check will be 
done every 24 hours).
 def autoUpdateCheck():
+       if globalVars.appArgs.secure: return
        splupdate.updateChecker(auto=True, 
continuous=SPLConfig["Update"]["AutoUpdateCheck"], 
confUpdateInterval=SPLConfig["Update"]["UpdateInterval"])
 
 # The timer itself.
 # A bit simpler than NVDA Core's auto update checker.
 def updateInit():
+       # #48 (18.02/15.13-LTS): no, not when secure mode flag is on.
+       if globalVars.appArgs.secure: return
        # LTS: Launch updater if channel change is detected.
        # Use a background thread for this as urllib blocks.
        import threading


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/c2408e734c79/
Changeset:   c2408e734c79
Branch:      None
User:        josephsl
Date:        2018-01-13 04:36:19+00:00
Summary:     Merge branch 'stable' of 
https://bitbucket.org/nvdaaddonteam/stationPlaylist

Affected #:  1 file

diff --git a/addon/doc/de/readme.md b/addon/doc/de/readme.md
index 1c02eca..5f9373d 100644
--- a/addon/doc/de/readme.md
+++ b/addon/doc/de/readme.md
@@ -67,7 +67,7 @@ WICHTIGE HINWEISE:
   developer using the default email client.
 * Alt+NVDA+F1: öffnet das Willkommensdialog.
 
-## nicht belegte Befehle
+## nicht zugewiesene Befehle
 
 The following commands are not assigned by default; if you wish to assign
 them, use Input Gestures dialog to add custom commands.
@@ -83,7 +83,7 @@ them, use Input Gestures dialog to add custom commands.
 * Announcing title of the currently playing track.
 * Marking current track for start of track time analysis.
 * Performing track time analysis.
-* Macht Schnappschüsse aus der Playlist.
+* nimmt Schnappschüsse aus der Playlist auf.
 * Find text in specific columns.
 * Find tracks with duration that falls within a given range via time range
   finder.
@@ -133,7 +133,7 @@ The available commands are:
 * A: Automatisierung.
 * C (Shift+C in JAWS and Window-Eyes layouts): Title for the currently
   playing track.
-* C (JAWS- und Window-Eyes-Darstellungen): Wechselt den Cart-Explorer (nur
+* C (JAWS- und Window-Eyes-Darstellungen): Wechselt die Cart-Übersicht (nur
   im Playlist-Viewer).
 * D (R in der JAWS-Darstellung): Restdauer der Playlist (wenn eine
   Fehlermeldung angezeigt wird, wechseln Sie zum Playlist-Viewer und geben
@@ -301,8 +301,7 @@ mode, then use the touch commands listed above to perform 
commands.
 * Windows 7 Service Pack 1 oder höher ist erforderlich.
 * Mehrere Zusatzfunktionen wurden erweitert. Dadurch können
   Mikrofonbenachrichtigung und Metadaten-Streaming auf Änderungen in
-  Broadcast-Konfigurationsprofilen reagieren. Dies erfordert NVDA
-  2017.4.Übersetzt mit www.DeepL.com/Translator
+  Broadcast-Konfigurationsprofilen reagieren. Dies erfordert NVDA 2017.4.
 * Beim Beenden des Studio schließen sich verschiedene Erweiterungsdialoge
   wie Einstellungen, Benachrichtigungsdialoge und andere automatisch. Dies
   erfordert NVDA 2017.4.
@@ -338,10 +337,10 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   eingeschaltet ist, gibt NVDA den Ton für die Mikrofonbenachrichtigung
   nicht mehr von überall her wieder.
 * Die Instant-Switch-Flag wird nicht aus dem Switch-Profil entfernt, wenn
-  Broadcast-Profile gelöscht werden und wenn ein anderes Profil ein
+  Sende-Profile gelöscht werden und wenn ein anderes Profil ein
   Instant-Switch-Profil ist.
-* Wenn Sie ein aktives Profil löschen, das kein Instant-Switch oder wenn das
-  profil ein zeitbasiertes Profil ist, fragt NVDA noch einmal nach einer
+* Wenn Sie ein aktives Profil löschen, das kein Instant-Switch-  oder wenn
+  das profil ein temporäres Profil ist, fragt NVDA noch einmal nach einer
   Bestätigung, bevor Sie fortfahren.
 * NVDA wendet die korrekten Einstellungen für die Einstellungen der
   Mikrofonbenachrichtigung an, wenn Profile über den Dialog für die
@@ -438,7 +437,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   Zeitschaltern ansagte.
 * NVDA kann die Ankündigung von Spaltenüberschriften wie Interpret und
   Kathegorie unterdrücken, wenn Titelim Playlist-Viewer betrachtet
-  werden. Dies ist eine Broadcast-Profil-spezifische Einstellung.
+  werden. Dies ist eine Sende-Profil-spezifische Einstellung.
 * Added a checkbox in add-on settings dialog to suppress announcement of
   column headers when reviewing tracks in playlist viewer.
 * Added a command in SPL Controller layer to announce name and duration of
@@ -454,8 +453,8 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   eine Playlist geladen ist. Dies gilt, auch wenn der erste Titel nicht
   fokussiert ist.
 * NVDA wird keine Fehlertöne mehr abspielen und entsprechend reagieren, wenn
-  nach einem Titel vorwärts vom letzten Titel bzw. rückwärts vom ersten
-  Titel gesucht wird.
+  vorwärts vom letzten Titel bzw. rückwärts vom ersten Titel nach einem
+  bestimmten Titel gesucht wird.
 * Drücken von NVDA+Nummernblock-Entfernen (NVDA+Entfernen im Laptop-Layout)
   wird nun die Titelposition und die Anzahl der Elemente in einer Playlist
   ausgeben.
@@ -472,7 +471,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   werden. Bei Standardinstallationen beträgt das Prüfintervall für
   Aktualisierungen 30 Tage.
 * Es wurde ein Problem behoben, bei dem NVDA manchmal einen Fehlerton
-  ausgab, wenn Studio beendet wurde. Dies trat auf, wenn ein zeitbasiertes
+  ausgab, wenn Studio beendet wurde. Dies trat auf, wenn ein temporäres
   Profil aktiv war.
 
 ## Version 17.04
@@ -513,7 +512,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   enthält. Drücken Sie Escape, um diese Webseite zu schließen.
 * Titeleingabe (Die Art der erweiterten Pfeiltasten in NVDA) wurde entfernt
   und durch Spaltenexplorer und Spaltennavigator/Befehele der
-  Tabellennavigation ersetzt. Dies betrifft Studio und Titelwerkzeuge.
+  Tabellennavigation ersetzt. Dies betrifft Studio und Tracktool.
 * Nach dem Schließen des Dialogs "Titel einfügen" während eines
   Suchduurchlaufs in der Bibliothek ist es nicht mehr erforderlich, im
   SPL-Assistenten Umschalt+R zu drücken, um den Scanfortschritt zu
@@ -530,7 +529,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   Studio erscheint, führen Befehle wie die verbleibende Zeit für einen Titel
   nicht mehr zur Ausgabe von Fehlertönen oder falscher Informationsangaben
   durch NVDA. Stattdessen wird eine Fehlermeldung ausgegeben. Für solche
-  Befehle ist es erforderlich, dass das Hauptfenster von Studio vorhanden
+  Befehle ist es erforderlich, dass das Hauptfenster von Studio maximiert
   ist.
 * Erstmalige  Unterstützung für StationPlaylist-Creator.
 * Added a new command in SPL Controller layer to announce Studio status such
@@ -539,8 +538,8 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
 ## Version 17.03
 
 * NVDA wird keine irreführenden Aktionen  mehr ausführen und auch keine
-  Fehlerton mehr abspielen, wennauf  ein zeitbasiertes Sendeprofil
-  gewechselt wird.
+  Fehlerton mehr abspielen, wenn auf  ein temporäres Sendeprofil gewechselt
+  wird.
 * Übersetzungen aktualisiert
 
 ## Version 17.01/15.5-LTS
@@ -558,8 +557,8 @@ Speicherort neuer Erweiterungsdateien.
   Studio minimiert ist, wird das Studio-Fenster als nicht verfügbar
   angezeigt. Bitte stellen Sie in diesem Fall das Studio-Fenster aus der
   Taskleiste wieder her.
-* Beim Bearbeiten von Carts während der Cart-Explorer aktiv ist, ist es
-  nicht mehr notwendig den Cart-Explorer erneut zu öffnen, um aktualisierte
+* Beim Bearbeiten von Carts während die Cart-Übersicht aktiv ist, ist es
+  nicht mehr notwendig die Cart-Übersicht erneut zu öffnen, um aktualisierte
   Cart-Zuweisungen anzuzeigen. Dies gilt, wenn der Cart-Bearbeitungsmodus
   deaktiviert ist. Folglich, die Meldung "Cart-Explorer reentry" wird nicht
   mehr angezeigt.
@@ -581,8 +580,8 @@ Speicherort neuer Erweiterungsdateien.
   nicht mehr durch die Einstellungen für die Sprachausführlichkeit und die
   Art der Statusansage beeinflusst (dieser Status wird immer über Sprache
   und/oder Braille angezeigt).
-* Das Hinzufügen von Kommentaren zu zeitgesteuerten Pausennotizen ist nicht
-  mehr möglich.
+* Das Hinzufügen von Kommentaren zu zeitgesteuerten Pausen ist nicht mehr
+  möglich.
 * Unterstützung für Track Tool 5.20. Ein Problem wurde behoben, bei dem
   falsche Informationen angesagt werden, wenn mit den Befehlen des
   Spaltenexplorers Spalteninformationen abgerufen werden.
@@ -629,8 +628,8 @@ verwenden.
   wurde hinzugefügt, um diesen Dialog nach dem Schließen wieder zu öffnen.
 * Änderungen an verschiedenen Tastaturbefehlen. Dazu gehören die Entfernung
   des Wechselns der Statusansage (STRG+NvDA+1), die Zuweisung der
-  Benachrichtigung zum Ende des Titels an Alt+NVDA+1, der Schalter für den
-  Cart-Explorer ist jetzt Alt+NvDA+3, der Mikrofon-Alarm-Dialog ist
+  Benachrichtigung zum Ende des Titels an Alt+NVDA+1, der Schalter für die
+  Cart-Übersicht ist jetzt Alt+NvDA+3, der Mikrofon-Alarm-Dialog ist
   Alt+NVDA+4 und der Einstellundsdialog der Erweiterung / des Encoders ist
   Alt+NvDA+0. Dies wurde geändert, damit STRG+NVDA+Zajlenreihe dem
   Spaltenexplorer zugewiesen werden kann.
@@ -655,9 +654,9 @@ verwenden.
 * Beim Zurücksetzen der Einstellungen für die Studio-Erweiterung können Sie
   nun festlegen, was zurückgesetzt werden soll. Standardmäßig werden die
   Einstellungen der Erweiterung zurückgesetzt, wobei die Kontrollkästchen
-  für das Zurücksetzen des Instant-Switch-Profils, des zeitbasierten
-  Profils, der Encoder-Einstellungen und des Löschens von Titelkommentaren
-  im Einstellungsdialog hinzugefügt wurden.
+  für das Zurücksetzen des Instant-Switch-Profils, des temporären Profils,
+  der Encoder-Einstellungen und des Löschens von Titelkommentaren im
+  Einstellungsdialog hinzugefügt wurden.
 * Im Track Tool können Sie Informationen über Album und CD-Code erhalten,
   indem Sie STRG+NVDA+9 bzw. STRG+NVDA+0 drücken.
 * Performance-Verbesserungen beim erstmaligen Abrufen von
@@ -702,13 +701,13 @@ für stabile Versionen.
 ## Änderungen in7.2
 
 * Aufgrund der Entfernung des alten internen Konfigurationsformats ist es
-  zwingend erforderlich, das Add-on 7.2 zu installieren. Nach der
+  zwingend erforderlich das Add-on 7.2 zu installieren. Nach der
   Installation können Sie nicht mehr auf eine frühere Version des Add-ons
   zurückgreifen.
 * Added a command in SPL Controller to report listener count (I).
 * Mit Alt+NVDA+0 können Sie nun die Einstellungen zur Studio-Erweiterung und
   die Dialoge für die Encoder-Einstellungen öffnen. Sie können diese Dialoge
-  auch weiterhin mit Control+NVDA+0 öffnen (in der Version 8.0 nur
+  auch weiterhin mit Control+NVDA+0 öffnen (in der Version 8.0 nur noch
   Alt+NVDA+0 verfügbar).
 * Im Track Tool können Sie mit Strg+Alt+Links oder Rechtspfeil zwischen den
   Spalten navigieren.
@@ -725,7 +724,7 @@ für stabile Versionen.
   aufgetreten sind.
 * Wenn Sie beim Zurücksetzen der Einstellungen mit "nein" antworten, werden
   Sie zum Dialogfeld "Einstellungen zur Studio-Erweiterung" zurückgeleitet
-  und NVDA merkt sich die sofortige Einstellung des Switch-Profils.
+  und NVDA merkt sich die Einstellungen des Instant-Switch-Profils.
 * NVDA wird Sie auffordern Streambezeichnungen und andere Encoder-Optionen
   neu zu konfigurieren, wenn die Encoder-Konfigurationsdatei beschädigt ist.
 
@@ -766,14 +765,14 @@ für stabile Versionen.
 * NVDA kann so konfiguriert werden, dass es zu einem bestimmten Sendeprofil
   an einem bestimmten Tag und zu einer bestimmten Uhrzeit
   wechselt. Verwenden Sie den neuen Triggerdialog in den Einstellungen zur
-  Studio-Erweiterung, um dies zu einzustellen.
+  Studio-Erweiterung, um dies einzustellen.
 * NVDA meldet den Namen des Profils, zu dem über den Instant-Switch-Schalter
-  (F12 im SPL-Assistenten) gewechselt wurde, oder als Folge der Aktivierung
-  des zeitbasierten Profils.
+  (F12 im SPL-Assistenten) gewechselt wurde, oder auch beim Aktivieren des
+  temporären Profils.
 * Der Schalter für den Instant-Switch (jetzt ein Kontrollkästchen) wurde in
   den neuen Triggerdialog verschoben.
 * Einträge in der Ausklappliste für die Profile in den Einstellungen zur
-  Erweiterung zeigen nun Profil-Flags, wie z.B. aktiv, ob es sich um ein
+  Erweiterung beinhalten nun Profil-Flags, wie z.B. aktiv, ob es sich um ein
   Instant-Switch-Profil handelt und so weiter.
 * Wenn ein ernsthaftes Problem mit dem Lesen von Sendeprofildateien gefunden
   wird, zeigt NVDA einen Fehlerdialog an, setzt die Einstellungen auf die
@@ -794,7 +793,7 @@ für stabile Versionen.
 * Der Versuch, die Metadaten-Konfigurationseinstellung im Einstellungsdialog
   zur Erweiterung zu öffnen, während der schnelle Metadaten-Streaming-Dialog
   geöffnet ist, führt nicht mehr zu einem Fehlerton. NVDA fordert Sie nun
-  auf, den Metadaten-Streaming-Dialog zu schließen, bevor Sie die
+  auf, den Dialog Metadaten-Streaming zu schließen, bevor Sie die
   Einstellungen öffnen können.
 * Bei der Ansage der Zeit, wie z.B. der Restdauer für den laufenden Titel,
   werden auch die Stunden angesagt. Daher ist die Einstellung der
@@ -821,7 +820,7 @@ für stabile Versionen.
 * Verbesserungen der internen Sicherheit.
 * Wenn Version 6.3 oder höher auf einem Computer mit Windows 8 oder höher
   mit NVDA 2016.1 oder höher gestartet wird, wird ein Warndialog angezeigt,
-  in dem Sie aufgefordert werden, die Reduzierung der Lautstärke anderer
+  in dem Sie aufgefordert werden die Reduzierung der Lautstärke anderer
   Anwendungen (NVDA+Umschalt+D) zu deaktivieren. Markieren Sie das
   Kontrollkästchen, um diesen Dialog in Zukunft zu unterdrücken.
 * Es wurde ein Befehl hinzugefügt, um Fehlerberichte, Funktionsvorschläge
@@ -831,7 +830,7 @@ für stabile Versionen.
 
 ## Änderungen in6.2
 
-* Im SPL-Assistenten wurde ein Problem mit dem Befehl "Playlist Restbestand"
+* Im SPL-Assistenten wurde ein Problem mit dem Befehl "Playlist Restdauer"
   (D) (R, wenn Kompatibilitätsmodus eingeschaltet ist) behoben, bei dem die
   Dauer für die aktuelle Stunde statt der gesamten Playlist angesagt
   wurde. Das Verhalten dieses Befehls kann über die erweiterten
@@ -867,7 +866,7 @@ für stabile Versionen.
 * Wenn Sie einen SPL-Assistenten-Befehl mit einer benutzerdefinierten
   Tastaturkombination verwenden (z. B. Befehl für den nächsten Titel), ist
   es nicht mehr erforderlich, im Playlist-Viewer des Studios zu bleiben. Die
-  Befehle können nun von anderen Studio-Fenstern aus ausgeführt werden.
+  Befehle können nun aus anderen Studio-Fenstern ausgeführt werden.
 
 ## Änderungen in6.0
 
@@ -893,106 +892,127 @@ für stabile Versionen.
 * Added a time range finder dialog (command unassigned) to find a track with
   duration that falls within a specified range, useful if wishing to find a
   track to fill an hour slot.
-* Added ability to reorder track column announcement and to suppress
-  announcement of specific columns if "use screen order" is unchecked from
-  add-on settings dialog. Use "manage column announcement" dialog to reorder
-  columns.
-* Added a dialog (command unassigned) to quickly toggle metadata streaming.
-* Added a setting in add-on settings dialog to configure when metadata
-  streaming status should be announced and to enable metadata streaming.
-* Added ability to mark a track as a place marker to return to it later (SPL
-  Assistant, Control+K to set, SPL Assistant, K to move to the marked
-  track).
-* Improved performance when searching for next or previous track text
-  containing the searched text.
-* Added a setting in add-on settings dialog to configure alarm notification
-  (beep, message or both).
-* It is now possible to configure microphone alarm between 0 (disabled) and
-  two hours (7200 seconds) and to use up and down arrow keys to configure
-  this setting.
-* Added a setting in add-on settings dialog to allow microphone active
-  notification to be given periodically.
-* You can now use Track Dial toggle command in Studio to toggle Track Dial
-  in Track Tool provided that you didn't assign a command to toggle Track
-  Dial in Track Tool.
-* Added ability to use SPL Controller layer command to invoke SPL Assistant
-  layer (configurable from advanced Settings dialog found in add-on settings
-  dialog).
-* Added ability for NvDA to use certain SPL Assistant commands used by other
-  screen readers. To configure this, go to add-on settings, select Advanced
-  Settings and check screen reader compatibility mode checkbox.
-* In encoders, settings such as focusing to Studio when connected are now
-  remembered.
-* It is now possible to view various columns from encoder window (such as
-  encoder connection status) via Control+NVDA+number command; consult the
-  encoder commands above.
-* Fixed a rare bug where switching to Studio or closing an NVDA dialog
-  (including Studio add-on dialogs) prevented track commands (such as
-  toggling Track Dial) from working as expected.
+* Die Ansage von Titelspalten kann jetzt neu angeordnet und die Ansage
+  bestimmter Spalten kann nun unterdrückt werden. Dies gilt nur, wenn das
+  Kontrollkästchen "Bildschirmreihenfolge verwenden" im Dialogfeld
+  "Einstellungen zur Erweiterung" deaktiviert ist. Verwenden Sie den Dialog
+  "Spaltenansagen verwalten", um Spalten neu anzuordnen.
+* Es wurde ein Dialog hinzugefügt, um schnell und einfach
+  Metadaten-Streaming umzuschalten. Ein Tastaturbefehl wurde noch nicht
+  zugewiesen.
+* Im Dialogfeld "Einstellungen zur Erweiterung" kann jetzt konfiguriert
+  werden, wann der Status des Metadaten-Streaming angekündigt werden
+  soll. Das Streaming von Metadaten kann in diesem Dialog auch aktiviert
+  werden.
+* Es wurde die Möglichkeit hinzugefügt, einen Titel im SPL-Assistenten als
+  Lesezeichen zu setzen, um später zu ihm zurückzukehren. STRG+K zum
+  Einstellen, K zum Bewegen zum markierten Titel.
+* Die Performance bei der Suche nach dem nächsten oder vorherigen Titeltext,
+  der den gesuchten Text enthält, wurde verbessert.
+* Die Alarmbenachrichtigung kann jetzt als Piepton, Nachricht oder beides
+  konfiguriert werden.
+* Die periodische Mikrofonbenachrichtigung kann jeztt  zwischen 0
+  (deaktiviert) und zwei Stunden (7200 Sekunden) konfiguriert werden. Diese
+  Einstellung kann mit den Pfeiltasten nach oben und unten angepasst werden.
+* Es wurde eine Einstellung im Dialogfeld "Einstellungen zur Erweiterung"
+  hinzugefügt, die eine periodische Benachrichtigung über aktive Mikrofone
+  erlaubt.
+* Sie können jetzt die Befehlsschicht für das Umschalten der Titelnavigation
+  im Studio verwenden, um die Titelnavigation auch in Tracktool
+  umzuschalten, sofern Sie keinen Befehl zum Umschalten der Titelnavigation
+  im Tracktootl bereits zugewiesen haben.
+* Es wurde die Möglichkeit zugefügt, die Befehlsschicht für den
+  SPL-Controller zum Aufrufen der Ebene des SPL-Assistenten zu verwenden
+  (konfigurierbar über den Dialog "Erweiterte Einstellungen" im Dialogfeld
+  "Einstellungen zur Erweiterung").
+* NVDA kann nun bestimmte Befehle für den SPL-Assistenten von anderen
+  Screenreadern verarbeiten. Um dies zu konfigurieren, gehen Sie zu den
+  Einstellungen zur Erweiterung, wählen Sie Erweiterte Einstellungen und
+  aktivieren Sie das Kontrollkästchen  Kompatilibilitätsmodus mit anderen
+  Screenreadern.
+* Einstellungen wie Fokus auf Studio, wenn Encoder verbunden ist, werden
+  jetzt dauerhaft gespeichert.
+* Es ist nun möglich verschiedene Spalten aus Encoder-Fenstern
+  (z.B. Verbindungsstatus) über STRG+NVDA+Zahlen aus der Zahlenreihe
+  abzulesen. Siehe die Befehle für den Encoder weiter oben.
+* Ein seltener Fehler wurde behoben, bei dem bestimmte Titelbefehle
+  (z.B. hinsichtlich der Titelnavigation) nicht wie erwartet
+  funktionierten. Dies trat auf, wenn zum Studio-Fenster umgeschaltet oder
+  ein NVDA Dialog (einschließlich der Erweiterungsdialoge) geschlossen
+  wurde.
 
 ## Änderungen in 5.6
 
-* In Studio 5.10 and later, NVDA no longer announces "not selected" when the
-  selected track is playing.
-* Due to an issue with Studio itself, NVDA will now announce name of the
-  currently playing track automatically. An option to toggle this behavior
-  has been added in studio add-on settings dialog.
+* In Studio 5.10 und höher sagt NVDA nicht mehr "nicht ausgewählt", wenn der
+  ausgewählte Titel abgespielt wird.
+* Aufgrund eines Problems mit Studio selbst wird NVDA den Namen des aktuell
+  abgespielten Titels jetzt automatisch ankündigen. Eine Option, um dieses
+  Verhalten zu ändern, wurde im Dialog für die Einstellungen der
+  Studio-Erweiterung hinzugefügt.
 
 ## Änderungen in 5.5
 
-* Play after connecting setting will be remembered when moving away from the
-  encoder window.
+* Die Einstellung für die automatische Wiedergabe nach dem Verbindungsaufbau
+  eines Encoders wird gespeichert, auch wenn das Encoder-Fenster verlassen
+  wird.
 
 ## Änderungen in 5.4
 
-* Performing library scan from Insert Tracks dialog no longer causes NVDA to
-  not announce scan status or play error tones if NVDA is configured to
-  announce library scan progress or scan count.
+* Beim Durchführen von  Bibliothek-Scans Aus dem Dialog Titelfinder zeigt
+  NVDA keine Fehler mehr an. NVDA sagt nun den Scan-Status an, wenn NVDA so
+  konfiguriert ist, dass der Scanfortschritt oder Anzahl der Suchläufe
+  angekündigt werden sollen.
 * Übersetzungen aktualisiert
 
 ## Änderungen in 5.3
 
-* The fix for SAM Encoder (not playing the next track if a track is playing
-  and when the encoder connects) is now available for SPL Encoder users.
-* NVDA no longer plays errors or does not do anything when SPL Assistant, F1
-  (Assistant help dialog) is pressed.
+* Die Fehlerbehebung für SAM Encoder steht jetzt für Benutzer von
+  SPL-Encodern zur Verfügung.
+* Beim Drücken von f1 für die Hilfe im SPL-Assistenten zeigt NVDA keine
+  Fehler mehr an und reagiert entsprechend.
 
 ## Änderungen in 5.2
 
-* NVDA will no longer allow both settings and alarm dialogs to be opened. A
-  warning will be shown asking you to close the previously opened dialog
-  before opening another dialog.
-* When monitoring one or more encoders, pressing SPL Controller, E will now
-  announce encoder count, encoder ID and stream label(s) if any.
-* NVDA supports connect/disconnect all commands (Control+F9/Control+F10) in
-  SAM encoders.
-* NVDA will no longer play the next track if an encoder connects while
-  Studio is playing a track and Studio is told to play tracks when an
-  encoder is connected.
+* NVDA erlaubt nicht mehr das Einstellungs- und Benachrichtigungsdialog
+  gleichzeitig zu öffnen. Eine Warnung wird angezeigt, welche das Schließen
+  des zuvor geöffneten Dialogs vor dem Öffnen eines weiteren Dialogs
+  fordert.
+* Bei der Überwachung einer oder mehrerer Encoder wird nun durch Drücken von
+  e in der SPL-Steuerung die Anzahl der Encoder, Encoder-ID und
+  Streambezeichnungen angesagt, falls vorhanden.
+* NVDA unterstützt die Befehle Strg   F9 / Strg   F10 zum Verbinden /
+  Trennen aller Befehle in SAM-Encodern.
+* NVDA wird den nächsten Titel während dem Verbindungsaufbau mit einem
+  Encoder nicht mehr abspielen, während Studio einen Titel abspielt. Dies
+  gilt, wenn Studio so eingestellt wird, dass Titel nur bei verbundenem
+  Encoder abgespielt werden sollen.
 * Übersetzungen aktualisiert
 
 ## Änderungen in 5.1
 
-* It is now possible to review individual columns in Track Tool via Track
-  Dial (toggle key unassigned). Note that Studio must be active before using
-  this mode.
-* Added a check box in Studio add-on settings dialog to toggle announcement
-  of name of the currently playing cart.
-* Toggling microphone on and off via SPL Controller no longer causes error
-  tones to be played or toggle sound to not be played.
-* If a custom command is assigned for an SPL Assistant layer command and
-  this command is pressed right after entering SPL Assistant, NvDA will now
-  promptly exit SPL Assistant.
+* Es ist nun möglich, einzelne Spalten im Tracktool durch Titelnavigation
+  abzulesen (Befehl noch nicht zugewiesen). Beachten Sie: das Studio-Fenster
+  muss vor der Verwendung dieser Funktion aktiv sein.
+* Ein Kontrollkästchen wurde im Einstellungsdialog der Studio-Erweiterung
+  hinzugefügt, welches die Ansage des Namens des aktuell aktiven Carts
+  ermöglicht.
+* Beim Ein- und Ausschalten des Mikrofons werden nun keine Fehlertöne mehr
+  abgespielt. Die richtigen Töne werden stattdessen ausgegeben.
+* NVDA wird den SPL-Assistenten beenden, wenn ein benutzerdefinierter Befehl
+  für einen SPL-Assistent-Layer zugewiesen und dieser Befehl direkt nach dem
+  Start des SPL Assistenten gedrückt wird.
 
 ## Änderungen in 5.0
 
-* A dedicated settings dialog for SPL add-on has been added, accessible from
-  NVDA's preferences menu or by pressing Control+NVDA+0 from SPL window.
-* Added ability to reset all settings to defaults via configuration dialog.
-* If some of the settings have errors, only the affected settings will be
-  reset to factory defaults.
-* Added a dedicated SPL touchscreen mode and touch commands to perform
-  various Studio commands.
+* Ein dediziertes Einstellungsdialog für die SPL-Erweiterung wurde
+  hinzugefügt. Das Dialog kann aus  dem NVDA-Einstellungsmenü oder durch
+  Drücken von STRG+NVDA+0 aus dem SPL-Fenster aufgerufen werden.
+* Möglichkeit hinzugefüt, um alle Einstellungen auf die Standardwerte über
+  den Konfigurationsdialog zurückzusetzen.
+* Wenn einige der Einstellungen Fehler aufweisen, dann werden nur die
+  betroffenen Einstellungen auf die Werkseinstellungen zurückgesetzt.
+* Eine dedizierte SPL Touchscreen-Unterstützung wurde hinzugefügt, um
+  Touch-Befehle für verschiedene Studio-Funktionen nutzen zu können.
 * Zu den Änderungen in der Ebene des SPL-Assistenten gehören der neue Befehl
   für die Befehlshilfe (F1) und das Entfernen von Befehlen zum Umschalten
   der Anzahl der Zuhörer (Umschalt+I) sowie die geplante Zeitansage
@@ -1017,13 +1037,13 @@ für stabile Versionen.
   auch über die Einstellungen für die Studio-Erweiterung konfiguriert
   werden.
 * Es wurde ein Problem behoben, bei dem das Ausführen von Befehlen für den
-  Alarmdialog oder den Titelfinder eine andere Instanz desselben Dialogs
-  anzeigte, während ein anderer Alarm- oder Suchdialog geöffnet wurde. NVDA
-  öffnet nun eine Meldung, in der Sie aufgefordert werden, den zuvor
-  geöffneten Dialog zu schließen.
-* Änderungen und Korrekturen für den Cartenexplorer, einschließlich beim
-  Blättern durch fehlerhafte Kartenstapel, wenn der Benutzer nicht den
-  Playlist-Viewer fokussiert. Der Kartenexplorer überprüft nun, ob der
+  Benachrichtigungsdialog oder den Titelfinder eine andere Instanz desselben
+  Dialogs anzeigte, während ein anderer Benachrichtigungs- oder Suchdialog
+  geöffnet wurde. NVDA öffnet nun eine Meldung, in der Sie aufgefordert
+  werden, den zuvor geöffneten Dialog zu schließen.
+* Änderungen und Korrekturen für die Cart-Übersicht, einschließlich beim
+  Blättern durch fehlerhafte Cart-Stapel, wenn der Benutzer nicht den
+  Playlist-Viewer fokussiert. Die Cart-Übersicht überprüft nun, ob der
   Nutzer sich im Playlist-Viewer befindet.
 * Es wurde die Möglichkeit hinzugefügt, den Befehl für den Layer des
   SPL-Controllers zu verwenden, um den SPL-Assistenten aufzurufen
@@ -1042,7 +1062,7 @@ für stabile Versionen.
   Streabezeichnungen neu zuzuordnen, drücken Sie STRG+F12 und wählen Sie
   dann die Position des Encoders, den Sie entfernt haben.
 
-## Older releases
+## Ältere Versionen
 
 Please see changelog link for release notes for old add-on releases.
 


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/baceb273650f/
Changeset:   baceb273650f
Branch:      None
User:        josephsl
Date:        2018-01-13 04:38:46+00:00
Summary:     Merge branch 'master' into splupdate

Affected #:  1 file

diff --git a/addon/doc/de/readme.md b/addon/doc/de/readme.md
index 1c02eca..5f9373d 100644
--- a/addon/doc/de/readme.md
+++ b/addon/doc/de/readme.md
@@ -67,7 +67,7 @@ WICHTIGE HINWEISE:
   developer using the default email client.
 * Alt+NVDA+F1: öffnet das Willkommensdialog.
 
-## nicht belegte Befehle
+## nicht zugewiesene Befehle
 
 The following commands are not assigned by default; if you wish to assign
 them, use Input Gestures dialog to add custom commands.
@@ -83,7 +83,7 @@ them, use Input Gestures dialog to add custom commands.
 * Announcing title of the currently playing track.
 * Marking current track for start of track time analysis.
 * Performing track time analysis.
-* Macht Schnappschüsse aus der Playlist.
+* nimmt Schnappschüsse aus der Playlist auf.
 * Find text in specific columns.
 * Find tracks with duration that falls within a given range via time range
   finder.
@@ -133,7 +133,7 @@ The available commands are:
 * A: Automatisierung.
 * C (Shift+C in JAWS and Window-Eyes layouts): Title for the currently
   playing track.
-* C (JAWS- und Window-Eyes-Darstellungen): Wechselt den Cart-Explorer (nur
+* C (JAWS- und Window-Eyes-Darstellungen): Wechselt die Cart-Übersicht (nur
   im Playlist-Viewer).
 * D (R in der JAWS-Darstellung): Restdauer der Playlist (wenn eine
   Fehlermeldung angezeigt wird, wechseln Sie zum Playlist-Viewer und geben
@@ -301,8 +301,7 @@ mode, then use the touch commands listed above to perform 
commands.
 * Windows 7 Service Pack 1 oder höher ist erforderlich.
 * Mehrere Zusatzfunktionen wurden erweitert. Dadurch können
   Mikrofonbenachrichtigung und Metadaten-Streaming auf Änderungen in
-  Broadcast-Konfigurationsprofilen reagieren. Dies erfordert NVDA
-  2017.4.Übersetzt mit www.DeepL.com/Translator
+  Broadcast-Konfigurationsprofilen reagieren. Dies erfordert NVDA 2017.4.
 * Beim Beenden des Studio schließen sich verschiedene Erweiterungsdialoge
   wie Einstellungen, Benachrichtigungsdialoge und andere automatisch. Dies
   erfordert NVDA 2017.4.
@@ -338,10 +337,10 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   eingeschaltet ist, gibt NVDA den Ton für die Mikrofonbenachrichtigung
   nicht mehr von überall her wieder.
 * Die Instant-Switch-Flag wird nicht aus dem Switch-Profil entfernt, wenn
-  Broadcast-Profile gelöscht werden und wenn ein anderes Profil ein
+  Sende-Profile gelöscht werden und wenn ein anderes Profil ein
   Instant-Switch-Profil ist.
-* Wenn Sie ein aktives Profil löschen, das kein Instant-Switch oder wenn das
-  profil ein zeitbasiertes Profil ist, fragt NVDA noch einmal nach einer
+* Wenn Sie ein aktives Profil löschen, das kein Instant-Switch-  oder wenn
+  das profil ein temporäres Profil ist, fragt NVDA noch einmal nach einer
   Bestätigung, bevor Sie fortfahren.
 * NVDA wendet die korrekten Einstellungen für die Einstellungen der
   Mikrofonbenachrichtigung an, wenn Profile über den Dialog für die
@@ -438,7 +437,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   Zeitschaltern ansagte.
 * NVDA kann die Ankündigung von Spaltenüberschriften wie Interpret und
   Kathegorie unterdrücken, wenn Titelim Playlist-Viewer betrachtet
-  werden. Dies ist eine Broadcast-Profil-spezifische Einstellung.
+  werden. Dies ist eine Sende-Profil-spezifische Einstellung.
 * Added a checkbox in add-on settings dialog to suppress announcement of
   column headers when reviewing tracks in playlist viewer.
 * Added a command in SPL Controller layer to announce name and duration of
@@ -454,8 +453,8 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   eine Playlist geladen ist. Dies gilt, auch wenn der erste Titel nicht
   fokussiert ist.
 * NVDA wird keine Fehlertöne mehr abspielen und entsprechend reagieren, wenn
-  nach einem Titel vorwärts vom letzten Titel bzw. rückwärts vom ersten
-  Titel gesucht wird.
+  vorwärts vom letzten Titel bzw. rückwärts vom ersten Titel nach einem
+  bestimmten Titel gesucht wird.
 * Drücken von NVDA+Nummernblock-Entfernen (NVDA+Entfernen im Laptop-Layout)
   wird nun die Titelposition und die Anzahl der Elemente in einer Playlist
   ausgeben.
@@ -472,7 +471,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   werden. Bei Standardinstallationen beträgt das Prüfintervall für
   Aktualisierungen 30 Tage.
 * Es wurde ein Problem behoben, bei dem NVDA manchmal einen Fehlerton
-  ausgab, wenn Studio beendet wurde. Dies trat auf, wenn ein zeitbasiertes
+  ausgab, wenn Studio beendet wurde. Dies trat auf, wenn ein temporäres
   Profil aktiv war.
 
 ## Version 17.04
@@ -513,7 +512,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   enthält. Drücken Sie Escape, um diese Webseite zu schließen.
 * Titeleingabe (Die Art der erweiterten Pfeiltasten in NVDA) wurde entfernt
   und durch Spaltenexplorer und Spaltennavigator/Befehele der
-  Tabellennavigation ersetzt. Dies betrifft Studio und Titelwerkzeuge.
+  Tabellennavigation ersetzt. Dies betrifft Studio und Tracktool.
 * Nach dem Schließen des Dialogs "Titel einfügen" während eines
   Suchduurchlaufs in der Bibliothek ist es nicht mehr erforderlich, im
   SPL-Assistenten Umschalt+R zu drücken, um den Scanfortschritt zu
@@ -530,7 +529,7 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
   Studio erscheint, führen Befehle wie die verbleibende Zeit für einen Titel
   nicht mehr zur Ausgabe von Fehlertönen oder falscher Informationsangaben
   durch NVDA. Stattdessen wird eine Fehlermeldung ausgegeben. Für solche
-  Befehle ist es erforderlich, dass das Hauptfenster von Studio vorhanden
+  Befehle ist es erforderlich, dass das Hauptfenster von Studio maximiert
   ist.
 * Erstmalige  Unterstützung für StationPlaylist-Creator.
 * Added a new command in SPL Controller layer to announce Studio status such
@@ -539,8 +538,8 @@ Windows-Versionen wird eine 15.x LTS-Version sein.
 ## Version 17.03
 
 * NVDA wird keine irreführenden Aktionen  mehr ausführen und auch keine
-  Fehlerton mehr abspielen, wennauf  ein zeitbasiertes Sendeprofil
-  gewechselt wird.
+  Fehlerton mehr abspielen, wenn auf  ein temporäres Sendeprofil gewechselt
+  wird.
 * Übersetzungen aktualisiert
 
 ## Version 17.01/15.5-LTS
@@ -558,8 +557,8 @@ Speicherort neuer Erweiterungsdateien.
   Studio minimiert ist, wird das Studio-Fenster als nicht verfügbar
   angezeigt. Bitte stellen Sie in diesem Fall das Studio-Fenster aus der
   Taskleiste wieder her.
-* Beim Bearbeiten von Carts während der Cart-Explorer aktiv ist, ist es
-  nicht mehr notwendig den Cart-Explorer erneut zu öffnen, um aktualisierte
+* Beim Bearbeiten von Carts während die Cart-Übersicht aktiv ist, ist es
+  nicht mehr notwendig die Cart-Übersicht erneut zu öffnen, um aktualisierte
   Cart-Zuweisungen anzuzeigen. Dies gilt, wenn der Cart-Bearbeitungsmodus
   deaktiviert ist. Folglich, die Meldung "Cart-Explorer reentry" wird nicht
   mehr angezeigt.
@@ -581,8 +580,8 @@ Speicherort neuer Erweiterungsdateien.
   nicht mehr durch die Einstellungen für die Sprachausführlichkeit und die
   Art der Statusansage beeinflusst (dieser Status wird immer über Sprache
   und/oder Braille angezeigt).
-* Das Hinzufügen von Kommentaren zu zeitgesteuerten Pausennotizen ist nicht
-  mehr möglich.
+* Das Hinzufügen von Kommentaren zu zeitgesteuerten Pausen ist nicht mehr
+  möglich.
 * Unterstützung für Track Tool 5.20. Ein Problem wurde behoben, bei dem
   falsche Informationen angesagt werden, wenn mit den Befehlen des
   Spaltenexplorers Spalteninformationen abgerufen werden.
@@ -629,8 +628,8 @@ verwenden.
   wurde hinzugefügt, um diesen Dialog nach dem Schließen wieder zu öffnen.
 * Änderungen an verschiedenen Tastaturbefehlen. Dazu gehören die Entfernung
   des Wechselns der Statusansage (STRG+NvDA+1), die Zuweisung der
-  Benachrichtigung zum Ende des Titels an Alt+NVDA+1, der Schalter für den
-  Cart-Explorer ist jetzt Alt+NvDA+3, der Mikrofon-Alarm-Dialog ist
+  Benachrichtigung zum Ende des Titels an Alt+NVDA+1, der Schalter für die
+  Cart-Übersicht ist jetzt Alt+NvDA+3, der Mikrofon-Alarm-Dialog ist
   Alt+NVDA+4 und der Einstellundsdialog der Erweiterung / des Encoders ist
   Alt+NvDA+0. Dies wurde geändert, damit STRG+NVDA+Zajlenreihe dem
   Spaltenexplorer zugewiesen werden kann.
@@ -655,9 +654,9 @@ verwenden.
 * Beim Zurücksetzen der Einstellungen für die Studio-Erweiterung können Sie
   nun festlegen, was zurückgesetzt werden soll. Standardmäßig werden die
   Einstellungen der Erweiterung zurückgesetzt, wobei die Kontrollkästchen
-  für das Zurücksetzen des Instant-Switch-Profils, des zeitbasierten
-  Profils, der Encoder-Einstellungen und des Löschens von Titelkommentaren
-  im Einstellungsdialog hinzugefügt wurden.
+  für das Zurücksetzen des Instant-Switch-Profils, des temporären Profils,
+  der Encoder-Einstellungen und des Löschens von Titelkommentaren im
+  Einstellungsdialog hinzugefügt wurden.
 * Im Track Tool können Sie Informationen über Album und CD-Code erhalten,
   indem Sie STRG+NVDA+9 bzw. STRG+NVDA+0 drücken.
 * Performance-Verbesserungen beim erstmaligen Abrufen von
@@ -702,13 +701,13 @@ für stabile Versionen.
 ## Änderungen in7.2
 
 * Aufgrund der Entfernung des alten internen Konfigurationsformats ist es
-  zwingend erforderlich, das Add-on 7.2 zu installieren. Nach der
+  zwingend erforderlich das Add-on 7.2 zu installieren. Nach der
   Installation können Sie nicht mehr auf eine frühere Version des Add-ons
   zurückgreifen.
 * Added a command in SPL Controller to report listener count (I).
 * Mit Alt+NVDA+0 können Sie nun die Einstellungen zur Studio-Erweiterung und
   die Dialoge für die Encoder-Einstellungen öffnen. Sie können diese Dialoge
-  auch weiterhin mit Control+NVDA+0 öffnen (in der Version 8.0 nur
+  auch weiterhin mit Control+NVDA+0 öffnen (in der Version 8.0 nur noch
   Alt+NVDA+0 verfügbar).
 * Im Track Tool können Sie mit Strg+Alt+Links oder Rechtspfeil zwischen den
   Spalten navigieren.
@@ -725,7 +724,7 @@ für stabile Versionen.
   aufgetreten sind.
 * Wenn Sie beim Zurücksetzen der Einstellungen mit "nein" antworten, werden
   Sie zum Dialogfeld "Einstellungen zur Studio-Erweiterung" zurückgeleitet
-  und NVDA merkt sich die sofortige Einstellung des Switch-Profils.
+  und NVDA merkt sich die Einstellungen des Instant-Switch-Profils.
 * NVDA wird Sie auffordern Streambezeichnungen und andere Encoder-Optionen
   neu zu konfigurieren, wenn die Encoder-Konfigurationsdatei beschädigt ist.
 
@@ -766,14 +765,14 @@ für stabile Versionen.
 * NVDA kann so konfiguriert werden, dass es zu einem bestimmten Sendeprofil
   an einem bestimmten Tag und zu einer bestimmten Uhrzeit
   wechselt. Verwenden Sie den neuen Triggerdialog in den Einstellungen zur
-  Studio-Erweiterung, um dies zu einzustellen.
+  Studio-Erweiterung, um dies einzustellen.
 * NVDA meldet den Namen des Profils, zu dem über den Instant-Switch-Schalter
-  (F12 im SPL-Assistenten) gewechselt wurde, oder als Folge der Aktivierung
-  des zeitbasierten Profils.
+  (F12 im SPL-Assistenten) gewechselt wurde, oder auch beim Aktivieren des
+  temporären Profils.
 * Der Schalter für den Instant-Switch (jetzt ein Kontrollkästchen) wurde in
   den neuen Triggerdialog verschoben.
 * Einträge in der Ausklappliste für die Profile in den Einstellungen zur
-  Erweiterung zeigen nun Profil-Flags, wie z.B. aktiv, ob es sich um ein
+  Erweiterung beinhalten nun Profil-Flags, wie z.B. aktiv, ob es sich um ein
   Instant-Switch-Profil handelt und so weiter.
 * Wenn ein ernsthaftes Problem mit dem Lesen von Sendeprofildateien gefunden
   wird, zeigt NVDA einen Fehlerdialog an, setzt die Einstellungen auf die
@@ -794,7 +793,7 @@ für stabile Versionen.
 * Der Versuch, die Metadaten-Konfigurationseinstellung im Einstellungsdialog
   zur Erweiterung zu öffnen, während der schnelle Metadaten-Streaming-Dialog
   geöffnet ist, führt nicht mehr zu einem Fehlerton. NVDA fordert Sie nun
-  auf, den Metadaten-Streaming-Dialog zu schließen, bevor Sie die
+  auf, den Dialog Metadaten-Streaming zu schließen, bevor Sie die
   Einstellungen öffnen können.
 * Bei der Ansage der Zeit, wie z.B. der Restdauer für den laufenden Titel,
   werden auch die Stunden angesagt. Daher ist die Einstellung der
@@ -821,7 +820,7 @@ für stabile Versionen.
 * Verbesserungen der internen Sicherheit.
 * Wenn Version 6.3 oder höher auf einem Computer mit Windows 8 oder höher
   mit NVDA 2016.1 oder höher gestartet wird, wird ein Warndialog angezeigt,
-  in dem Sie aufgefordert werden, die Reduzierung der Lautstärke anderer
+  in dem Sie aufgefordert werden die Reduzierung der Lautstärke anderer
   Anwendungen (NVDA+Umschalt+D) zu deaktivieren. Markieren Sie das
   Kontrollkästchen, um diesen Dialog in Zukunft zu unterdrücken.
 * Es wurde ein Befehl hinzugefügt, um Fehlerberichte, Funktionsvorschläge
@@ -831,7 +830,7 @@ für stabile Versionen.
 
 ## Änderungen in6.2
 
-* Im SPL-Assistenten wurde ein Problem mit dem Befehl "Playlist Restbestand"
+* Im SPL-Assistenten wurde ein Problem mit dem Befehl "Playlist Restdauer"
   (D) (R, wenn Kompatibilitätsmodus eingeschaltet ist) behoben, bei dem die
   Dauer für die aktuelle Stunde statt der gesamten Playlist angesagt
   wurde. Das Verhalten dieses Befehls kann über die erweiterten
@@ -867,7 +866,7 @@ für stabile Versionen.
 * Wenn Sie einen SPL-Assistenten-Befehl mit einer benutzerdefinierten
   Tastaturkombination verwenden (z. B. Befehl für den nächsten Titel), ist
   es nicht mehr erforderlich, im Playlist-Viewer des Studios zu bleiben. Die
-  Befehle können nun von anderen Studio-Fenstern aus ausgeführt werden.
+  Befehle können nun aus anderen Studio-Fenstern ausgeführt werden.
 
 ## Änderungen in6.0
 
@@ -893,106 +892,127 @@ für stabile Versionen.
 * Added a time range finder dialog (command unassigned) to find a track with
   duration that falls within a specified range, useful if wishing to find a
   track to fill an hour slot.
-* Added ability to reorder track column announcement and to suppress
-  announcement of specific columns if "use screen order" is unchecked from
-  add-on settings dialog. Use "manage column announcement" dialog to reorder
-  columns.
-* Added a dialog (command unassigned) to quickly toggle metadata streaming.
-* Added a setting in add-on settings dialog to configure when metadata
-  streaming status should be announced and to enable metadata streaming.
-* Added ability to mark a track as a place marker to return to it later (SPL
-  Assistant, Control+K to set, SPL Assistant, K to move to the marked
-  track).
-* Improved performance when searching for next or previous track text
-  containing the searched text.
-* Added a setting in add-on settings dialog to configure alarm notification
-  (beep, message or both).
-* It is now possible to configure microphone alarm between 0 (disabled) and
-  two hours (7200 seconds) and to use up and down arrow keys to configure
-  this setting.
-* Added a setting in add-on settings dialog to allow microphone active
-  notification to be given periodically.
-* You can now use Track Dial toggle command in Studio to toggle Track Dial
-  in Track Tool provided that you didn't assign a command to toggle Track
-  Dial in Track Tool.
-* Added ability to use SPL Controller layer command to invoke SPL Assistant
-  layer (configurable from advanced Settings dialog found in add-on settings
-  dialog).
-* Added ability for NvDA to use certain SPL Assistant commands used by other
-  screen readers. To configure this, go to add-on settings, select Advanced
-  Settings and check screen reader compatibility mode checkbox.
-* In encoders, settings such as focusing to Studio when connected are now
-  remembered.
-* It is now possible to view various columns from encoder window (such as
-  encoder connection status) via Control+NVDA+number command; consult the
-  encoder commands above.
-* Fixed a rare bug where switching to Studio or closing an NVDA dialog
-  (including Studio add-on dialogs) prevented track commands (such as
-  toggling Track Dial) from working as expected.
+* Die Ansage von Titelspalten kann jetzt neu angeordnet und die Ansage
+  bestimmter Spalten kann nun unterdrückt werden. Dies gilt nur, wenn das
+  Kontrollkästchen "Bildschirmreihenfolge verwenden" im Dialogfeld
+  "Einstellungen zur Erweiterung" deaktiviert ist. Verwenden Sie den Dialog
+  "Spaltenansagen verwalten", um Spalten neu anzuordnen.
+* Es wurde ein Dialog hinzugefügt, um schnell und einfach
+  Metadaten-Streaming umzuschalten. Ein Tastaturbefehl wurde noch nicht
+  zugewiesen.
+* Im Dialogfeld "Einstellungen zur Erweiterung" kann jetzt konfiguriert
+  werden, wann der Status des Metadaten-Streaming angekündigt werden
+  soll. Das Streaming von Metadaten kann in diesem Dialog auch aktiviert
+  werden.
+* Es wurde die Möglichkeit hinzugefügt, einen Titel im SPL-Assistenten als
+  Lesezeichen zu setzen, um später zu ihm zurückzukehren. STRG+K zum
+  Einstellen, K zum Bewegen zum markierten Titel.
+* Die Performance bei der Suche nach dem nächsten oder vorherigen Titeltext,
+  der den gesuchten Text enthält, wurde verbessert.
+* Die Alarmbenachrichtigung kann jetzt als Piepton, Nachricht oder beides
+  konfiguriert werden.
+* Die periodische Mikrofonbenachrichtigung kann jeztt  zwischen 0
+  (deaktiviert) und zwei Stunden (7200 Sekunden) konfiguriert werden. Diese
+  Einstellung kann mit den Pfeiltasten nach oben und unten angepasst werden.
+* Es wurde eine Einstellung im Dialogfeld "Einstellungen zur Erweiterung"
+  hinzugefügt, die eine periodische Benachrichtigung über aktive Mikrofone
+  erlaubt.
+* Sie können jetzt die Befehlsschicht für das Umschalten der Titelnavigation
+  im Studio verwenden, um die Titelnavigation auch in Tracktool
+  umzuschalten, sofern Sie keinen Befehl zum Umschalten der Titelnavigation
+  im Tracktootl bereits zugewiesen haben.
+* Es wurde die Möglichkeit zugefügt, die Befehlsschicht für den
+  SPL-Controller zum Aufrufen der Ebene des SPL-Assistenten zu verwenden
+  (konfigurierbar über den Dialog "Erweiterte Einstellungen" im Dialogfeld
+  "Einstellungen zur Erweiterung").
+* NVDA kann nun bestimmte Befehle für den SPL-Assistenten von anderen
+  Screenreadern verarbeiten. Um dies zu konfigurieren, gehen Sie zu den
+  Einstellungen zur Erweiterung, wählen Sie Erweiterte Einstellungen und
+  aktivieren Sie das Kontrollkästchen  Kompatilibilitätsmodus mit anderen
+  Screenreadern.
+* Einstellungen wie Fokus auf Studio, wenn Encoder verbunden ist, werden
+  jetzt dauerhaft gespeichert.
+* Es ist nun möglich verschiedene Spalten aus Encoder-Fenstern
+  (z.B. Verbindungsstatus) über STRG+NVDA+Zahlen aus der Zahlenreihe
+  abzulesen. Siehe die Befehle für den Encoder weiter oben.
+* Ein seltener Fehler wurde behoben, bei dem bestimmte Titelbefehle
+  (z.B. hinsichtlich der Titelnavigation) nicht wie erwartet
+  funktionierten. Dies trat auf, wenn zum Studio-Fenster umgeschaltet oder
+  ein NVDA Dialog (einschließlich der Erweiterungsdialoge) geschlossen
+  wurde.
 
 ## Änderungen in 5.6
 
-* In Studio 5.10 and later, NVDA no longer announces "not selected" when the
-  selected track is playing.
-* Due to an issue with Studio itself, NVDA will now announce name of the
-  currently playing track automatically. An option to toggle this behavior
-  has been added in studio add-on settings dialog.
+* In Studio 5.10 und höher sagt NVDA nicht mehr "nicht ausgewählt", wenn der
+  ausgewählte Titel abgespielt wird.
+* Aufgrund eines Problems mit Studio selbst wird NVDA den Namen des aktuell
+  abgespielten Titels jetzt automatisch ankündigen. Eine Option, um dieses
+  Verhalten zu ändern, wurde im Dialog für die Einstellungen der
+  Studio-Erweiterung hinzugefügt.
 
 ## Änderungen in 5.5
 
-* Play after connecting setting will be remembered when moving away from the
-  encoder window.
+* Die Einstellung für die automatische Wiedergabe nach dem Verbindungsaufbau
+  eines Encoders wird gespeichert, auch wenn das Encoder-Fenster verlassen
+  wird.
 
 ## Änderungen in 5.4
 
-* Performing library scan from Insert Tracks dialog no longer causes NVDA to
-  not announce scan status or play error tones if NVDA is configured to
-  announce library scan progress or scan count.
+* Beim Durchführen von  Bibliothek-Scans Aus dem Dialog Titelfinder zeigt
+  NVDA keine Fehler mehr an. NVDA sagt nun den Scan-Status an, wenn NVDA so
+  konfiguriert ist, dass der Scanfortschritt oder Anzahl der Suchläufe
+  angekündigt werden sollen.
 * Übersetzungen aktualisiert
 
 ## Änderungen in 5.3
 
-* The fix for SAM Encoder (not playing the next track if a track is playing
-  and when the encoder connects) is now available for SPL Encoder users.
-* NVDA no longer plays errors or does not do anything when SPL Assistant, F1
-  (Assistant help dialog) is pressed.
+* Die Fehlerbehebung für SAM Encoder steht jetzt für Benutzer von
+  SPL-Encodern zur Verfügung.
+* Beim Drücken von f1 für die Hilfe im SPL-Assistenten zeigt NVDA keine
+  Fehler mehr an und reagiert entsprechend.
 
 ## Änderungen in 5.2
 
-* NVDA will no longer allow both settings and alarm dialogs to be opened. A
-  warning will be shown asking you to close the previously opened dialog
-  before opening another dialog.
-* When monitoring one or more encoders, pressing SPL Controller, E will now
-  announce encoder count, encoder ID and stream label(s) if any.
-* NVDA supports connect/disconnect all commands (Control+F9/Control+F10) in
-  SAM encoders.
-* NVDA will no longer play the next track if an encoder connects while
-  Studio is playing a track and Studio is told to play tracks when an
-  encoder is connected.
+* NVDA erlaubt nicht mehr das Einstellungs- und Benachrichtigungsdialog
+  gleichzeitig zu öffnen. Eine Warnung wird angezeigt, welche das Schließen
+  des zuvor geöffneten Dialogs vor dem Öffnen eines weiteren Dialogs
+  fordert.
+* Bei der Überwachung einer oder mehrerer Encoder wird nun durch Drücken von
+  e in der SPL-Steuerung die Anzahl der Encoder, Encoder-ID und
+  Streambezeichnungen angesagt, falls vorhanden.
+* NVDA unterstützt die Befehle Strg   F9 / Strg   F10 zum Verbinden /
+  Trennen aller Befehle in SAM-Encodern.
+* NVDA wird den nächsten Titel während dem Verbindungsaufbau mit einem
+  Encoder nicht mehr abspielen, während Studio einen Titel abspielt. Dies
+  gilt, wenn Studio so eingestellt wird, dass Titel nur bei verbundenem
+  Encoder abgespielt werden sollen.
 * Übersetzungen aktualisiert
 
 ## Änderungen in 5.1
 
-* It is now possible to review individual columns in Track Tool via Track
-  Dial (toggle key unassigned). Note that Studio must be active before using
-  this mode.
-* Added a check box in Studio add-on settings dialog to toggle announcement
-  of name of the currently playing cart.
-* Toggling microphone on and off via SPL Controller no longer causes error
-  tones to be played or toggle sound to not be played.
-* If a custom command is assigned for an SPL Assistant layer command and
-  this command is pressed right after entering SPL Assistant, NvDA will now
-  promptly exit SPL Assistant.
+* Es ist nun möglich, einzelne Spalten im Tracktool durch Titelnavigation
+  abzulesen (Befehl noch nicht zugewiesen). Beachten Sie: das Studio-Fenster
+  muss vor der Verwendung dieser Funktion aktiv sein.
+* Ein Kontrollkästchen wurde im Einstellungsdialog der Studio-Erweiterung
+  hinzugefügt, welches die Ansage des Namens des aktuell aktiven Carts
+  ermöglicht.
+* Beim Ein- und Ausschalten des Mikrofons werden nun keine Fehlertöne mehr
+  abgespielt. Die richtigen Töne werden stattdessen ausgegeben.
+* NVDA wird den SPL-Assistenten beenden, wenn ein benutzerdefinierter Befehl
+  für einen SPL-Assistent-Layer zugewiesen und dieser Befehl direkt nach dem
+  Start des SPL Assistenten gedrückt wird.
 
 ## Änderungen in 5.0
 
-* A dedicated settings dialog for SPL add-on has been added, accessible from
-  NVDA's preferences menu or by pressing Control+NVDA+0 from SPL window.
-* Added ability to reset all settings to defaults via configuration dialog.
-* If some of the settings have errors, only the affected settings will be
-  reset to factory defaults.
-* Added a dedicated SPL touchscreen mode and touch commands to perform
-  various Studio commands.
+* Ein dediziertes Einstellungsdialog für die SPL-Erweiterung wurde
+  hinzugefügt. Das Dialog kann aus  dem NVDA-Einstellungsmenü oder durch
+  Drücken von STRG+NVDA+0 aus dem SPL-Fenster aufgerufen werden.
+* Möglichkeit hinzugefüt, um alle Einstellungen auf die Standardwerte über
+  den Konfigurationsdialog zurückzusetzen.
+* Wenn einige der Einstellungen Fehler aufweisen, dann werden nur die
+  betroffenen Einstellungen auf die Werkseinstellungen zurückgesetzt.
+* Eine dedizierte SPL Touchscreen-Unterstützung wurde hinzugefügt, um
+  Touch-Befehle für verschiedene Studio-Funktionen nutzen zu können.
 * Zu den Änderungen in der Ebene des SPL-Assistenten gehören der neue Befehl
   für die Befehlshilfe (F1) und das Entfernen von Befehlen zum Umschalten
   der Anzahl der Zuhörer (Umschalt+I) sowie die geplante Zeitansage
@@ -1017,13 +1037,13 @@ für stabile Versionen.
   auch über die Einstellungen für die Studio-Erweiterung konfiguriert
   werden.
 * Es wurde ein Problem behoben, bei dem das Ausführen von Befehlen für den
-  Alarmdialog oder den Titelfinder eine andere Instanz desselben Dialogs
-  anzeigte, während ein anderer Alarm- oder Suchdialog geöffnet wurde. NVDA
-  öffnet nun eine Meldung, in der Sie aufgefordert werden, den zuvor
-  geöffneten Dialog zu schließen.
-* Änderungen und Korrekturen für den Cartenexplorer, einschließlich beim
-  Blättern durch fehlerhafte Kartenstapel, wenn der Benutzer nicht den
-  Playlist-Viewer fokussiert. Der Kartenexplorer überprüft nun, ob der
+  Benachrichtigungsdialog oder den Titelfinder eine andere Instanz desselben
+  Dialogs anzeigte, während ein anderer Benachrichtigungs- oder Suchdialog
+  geöffnet wurde. NVDA öffnet nun eine Meldung, in der Sie aufgefordert
+  werden, den zuvor geöffneten Dialog zu schließen.
+* Änderungen und Korrekturen für die Cart-Übersicht, einschließlich beim
+  Blättern durch fehlerhafte Cart-Stapel, wenn der Benutzer nicht den
+  Playlist-Viewer fokussiert. Die Cart-Übersicht überprüft nun, ob der
   Nutzer sich im Playlist-Viewer befindet.
 * Es wurde die Möglichkeit hinzugefügt, den Befehl für den Layer des
   SPL-Controllers zu verwenden, um den SPL-Assistenten aufzurufen
@@ -1042,7 +1062,7 @@ für stabile Versionen.
   Streabezeichnungen neu zuzuordnen, drücken Sie STRG+F12 und wählen Sie
   dann die Position des Encoders, den Sie entfernt haben.
 
-## Older releases
+## Ältere Versionen
 
 Please see changelog link for release notes for old add-on releases.
 


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/a3a53459d7bb/
Changeset:   a3a53459d7bb
Branch:      None
User:        josephsl
Date:        2018-01-13 16:43:17+00:00
Summary:     Advanced options (18.02): do not show update controls if add-on 
updating isn't supported. re #48.

If the add-on isn't capable of updating itself, then there's no need to show 
config options. The only way to edit update options such as update channel 
under this scenario is Python Console unless that too is disabled.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index fcc3a7c..f652121 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -1433,7 +1433,8 @@ class SayStatusDialog(wx.Dialog):
 class AdvancedOptionsDialog(wx.Dialog):
 
        # Available channels (if there's only one, channel selection list will 
not be shown).
-       _updateChannels = ("try", "dev", "stable")
+       # Prepare for a day when channels list is NULL.
+       _updateChannels = ["try", "dev", "stable"]
 
        def __init__(self, parent):
                # Translators: The title of a dialog to configure advanced SPL 
add-on options such as update checking.
@@ -1442,11 +1443,14 @@ class AdvancedOptionsDialog(wx.Dialog):
                mainSizer = wx.BoxSizer(wx.VERTICAL)
                advOptionsHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
 
-               # Translators: A checkbox to toggle automatic add-on updates.
-               
self.autoUpdateCheckbox=advOptionsHelper.addItem(wx.CheckBox(self,label=_("Automatically
 check for add-on &updates")))
-               self.autoUpdateCheckbox.SetValue(self.Parent.autoUpdateCheck)
-               # Translators: The label for a setting in SPL add-on 
settings/advanced options to select automatic update interval in days.
-               
self.updateInterval=advOptionsHelper.addLabeledControl(_("Update &interval in 
days"), gui.nvdaControls.SelectOnFocusSpinCtrl, min=0, max=180, 
initial=self.Parent.updateInterval)
+               # #48 (18.02): do not show auto-update checkbox and interval 
options if not needed.
+               if splupdate.isAddonUpdatingSupported() == 
splupdate.SPLUpdateErrorNone:
+                       self._updateChannels = [None]
+                       # Translators: A checkbox to toggle automatic add-on 
updates.
+                       
self.autoUpdateCheckbox=advOptionsHelper.addItem(wx.CheckBox(self,label=_("Automatically
 check for add-on &updates")))
+                       
self.autoUpdateCheckbox.SetValue(self.Parent.autoUpdateCheck)
+                       # Translators: The label for a setting in SPL add-on 
settings/advanced options to select automatic update interval in days.
+                       
self.updateInterval=advOptionsHelper.addLabeledControl(_("Update &interval in 
days"), gui.nvdaControls.SelectOnFocusSpinCtrl, min=0, max=180, 
initial=self.Parent.updateInterval)
                # For releases that support channel switching.
                if len(self._updateChannels) > 1:
                        # Translators: The label for a combo box to select 
update channel.
@@ -1474,10 +1478,14 @@ class AdvancedOptionsDialog(wx.Dialog):
                mainSizer.Add(advOptionsHelper.sizer, 
border=gui.guiHelper.BORDER_FOR_DIALOGS, flag=wx.ALL)
                mainSizer.Fit(self)
                self.Sizer = mainSizer
-               self.autoUpdateCheckbox.SetFocus()
+               try:
+                       self.autoUpdateCheckbox.SetFocus()
+               except AttributeError:
+                       self.splConPassthroughCheckbox.SetFocus()
                self.Center(wx.BOTH | CENTER_ON_SCREEN)
 
        def onOk(self, evt):
+               addonUpdatingSupported = splupdate.isAddonUpdatingSupported() 
== splupdate.SPLUpdateErrorNone
                # The try (fast ring) builds aren't for the faint of heart.
                # 17.10: nor for old Windows releases anymore.
                if len(self._updateChannels) > 1:
@@ -1492,21 +1500,23 @@ class AdvancedOptionsDialog(wx.Dialog):
                                        wx.YES_NO | wx.NO_DEFAULT | 
wx.ICON_QUESTION, self
                                ) == wx.NO:
                                        return
-               # If update interval is set to zero, update check will happen 
every time the app module loads, so warn users.
-               updateInterval = self.updateInterval.Value
-               if self.Parent.updateInterval > 0 and updateInterval == 0 and 
gui.messageBox(
-                       # Translators: The confirmation prompt displayed when 
changing update interval to zero days (updates will be checked every time 
Studio app module loads).
-                       _("Update interval has been set to zero days, so 
updates to the Studio add-on will be checked every time NVDA and/or Studio 
starts. Are you sure you wish to continue?"),
-                       # Translators: The title of the update interval dialog.
-                       _("Confirm update interval"),
-                       wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION, self
-               ) == wx.NO:
-                       return
+               if addonUpdatingSupported:
+                       # If update interval is set to zero, update check will 
happen every time the app module loads, so warn users.
+                       updateInterval = self.updateInterval.Value
+                       if self.Parent.updateInterval > 0 and updateInterval == 
0 and gui.messageBox(
+                               # Translators: The confirmation prompt 
displayed when changing update interval to zero days (updates will be checked 
every time Studio app module loads).
+                               _("Update interval has been set to zero days, 
so updates to the Studio add-on will be checked every time NVDA and/or Studio 
starts. Are you sure you wish to continue?"),
+                               # Translators: The title of the update interval 
dialog.
+                               _("Confirm update interval"),
+                               wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION, 
self
+                       ) == wx.NO:
+                               return
                parent = self.Parent
                parent.splConPassthrough = self.splConPassthroughCheckbox.Value
                parent.compLayer = 
self.compatibilityLayouts[self.compatibilityList.GetSelection()][0]
-               parent.autoUpdateCheck = self.autoUpdateCheckbox.Value
-               parent.updateInterval = updateInterval
+               if addonUpdatingSupported:
+                       parent.autoUpdateCheck = self.autoUpdateCheckbox.Value
+                       parent.updateInterval = updateInterval
                if len(self._updateChannels) > 1: parent.updateChannel = 
self._updateChannels[self.channels.GetSelection()]
                parent.profiles.SetFocus()
                parent.Enable()


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/5af08481296a/
Changeset:   5af08481296a
Branch:      None
User:        josephsl
Date:        2018-01-14 00:56:48+00:00
Summary:     Update check/advanced options dialog (18.02): show update channel 
if papropriate.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/splconfui.py 
b/addon/appModules/splstudio/splconfui.py
index f652121..40ef3df 100755
--- a/addon/appModules/splstudio/splconfui.py
+++ b/addon/appModules/splstudio/splconfui.py
@@ -1444,13 +1444,14 @@ class AdvancedOptionsDialog(wx.Dialog):
                advOptionsHelper = gui.guiHelper.BoxSizerHelper(self, 
orientation=wx.VERTICAL)
 
                # #48 (18.02): do not show auto-update checkbox and interval 
options if not needed.
+               # The exception will be custom try builds.
                if splupdate.isAddonUpdatingSupported() == 
splupdate.SPLUpdateErrorNone:
-                       self._updateChannels = [None]
                        # Translators: A checkbox to toggle automatic add-on 
updates.
                        
self.autoUpdateCheckbox=advOptionsHelper.addItem(wx.CheckBox(self,label=_("Automatically
 check for add-on &updates")))
                        
self.autoUpdateCheckbox.SetValue(self.Parent.autoUpdateCheck)
                        # Translators: The label for a setting in SPL add-on 
settings/advanced options to select automatic update interval in days.
                        
self.updateInterval=advOptionsHelper.addLabeledControl(_("Update &interval in 
days"), gui.nvdaControls.SelectOnFocusSpinCtrl, min=0, max=180, 
initial=self.Parent.updateInterval)
+               else: self._updateChannels = [None]
                # For releases that support channel switching.
                if len(self._updateChannels) > 1:
                        # Translators: The label for a combo box to select 
update channel.


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/198dd7915bd5/
Changeset:   198dd7915bd5
Branch:      None
User:        josephsl
Date:        2018-01-14 06:48:46+00:00
Summary:     Studio API 2018: select track function is now part of pslbase.

Another oversight: forgot that selectTrack function is part of splbase. This 
fixes vertical column error in recent builds.

Affected #:  1 file

diff --git a/addon/appModules/splstudio/__init__.py 
b/addon/appModules/splstudio/__init__.py
index be11a9b..aaf131a 100755
--- a/addon/appModules/splstudio/__init__.py
+++ b/addon/appModules/splstudio/__init__.py
@@ -241,7 +241,7 @@ class SPLTrackItem(IAccessible):
                        self.appModule._announceColumnOnly = True
                        newTrack._curColumnNumber = self._curColumnNumber
                        newTrack.setFocus(), newTrack.setFocus()
-                       selectTrack(newTrack.IAccessibleChildID-1)
+                       splbase.selectTrack(newTrack.IAccessibleChildID-1)
 
        def script_prevRowColumn(self, gesture):
                newTrack = self.previous
@@ -251,7 +251,7 @@ class SPLTrackItem(IAccessible):
                        self.appModule._announceColumnOnly = True
                        newTrack._curColumnNumber = self._curColumnNumber
                        newTrack.setFocus(), newTrack.setFocus()
-                       selectTrack(newTrack.IAccessibleChildID-1)
+                       splbase.selectTrack(newTrack.IAccessibleChildID-1)
 
        # Overlay class version of Columns Explorer.
 
@@ -1109,7 +1109,7 @@ class AppModule(appModuleHandler.AppModule):
                        # We need to fire set focus event twice and exit this 
routine (return if 5.0x).
                        # 16.10.1/15.2 LTS: Just select this track in order to 
prevent a dispute between NVDA and SPL in regards to focused track.
                        # 16.11: Call setFocus if it is post-5.01, as SPL API 
can be used to select the desired track.
-                       selectTrack(track.IAccessibleChildID-1)
+                       splbase.selectTrack(track.IAccessibleChildID-1)
                        track.setFocus(), track.setFocus()
                else:
                        wx.CallAfter(gui.messageBox,
@@ -2060,7 +2060,7 @@ class AppModule(appModuleHandler.AppModule):
                else:
                        track = self._trackLocator(self.placeMarker[1], 
obj=api.getFocusObject().parent.firstChild, columns=[self.placeMarker[0]])
                        # 16.11: Just like Track Finder, use select track 
function to select the place marker track.
-                       selectTrack(track.IAccessibleChildID-1)
+                       splbase.selectTrack(track.IAccessibleChildID-1)
                        track.setFocus(), track.setFocus()
 
        def script_metadataStreamingAnnouncer(self, gesture):


https://bitbucket.org/nvdaaddonteam/stationplaylist/commits/ccbace955060/
Changeset:   ccbace955060
Branch:      stable
User:        josephsl
Date:        2018-01-14 19:04:21+00:00
Summary:     Readme entries for various fixes incliuding update management. 
Fixes #44, #45, #47, #48.

Affected #:  1 file

diff --git a/readme.md b/readme.md
index 01a69ba..f30af1a 100755
--- a/readme.md
+++ b/readme.md
@@ -14,6 +14,8 @@ IMPORTANT NOTES:
 * If using Windows 8 or later, for best experience, disable audio ducking mode.
 * add-on 8.0/16.10 requires Studio 5.10 or later. For broadcasters using 
Studio 5.0x and/or Windows XP, Vista or 7 without Service Pack 1, a [long-term 
support version][3] (15.x) is available. The last stable version to support 
Windows releases prior to 7 Service Pack 1 is 17.11.2.
 * Starting from 2018, [changelogs for old add-on releases][5] will be found on 
GitHub. This add-on readme will list changes from version 5.0 (2015 onwards).
+* Certain add-on features (notably add-on updating) won't work under some 
conditions, including running NVDA in secure mode.
+* Due to tecnical limitations, you cannot install or use this add-on on 
Windows Store version of NVDA.
 
 ## Shortcut keys
 
@@ -184,6 +186,9 @@ If you are using Studio on a touchscreen computer running 
Windows 8 or later and
 ## Version 18.02
 
 * Due to internal changes made to support extension points and other features, 
NVDA 2017.4 is required.
+* Add-on updating won't be possible under some cases. These include running 
NVDA from source code or with secure mode turned on.
+* If errors occur while checking for updates, these will be logged and NVDA 
will advise you to read the NVDA log for details.
+* In add-on settings, various update settings in advanced settings section 
such as update interval will not be displayed if add-on updating is not 
supported.
 * NVDA will no longer appear to freeze or do nothing when switching to an 
instant switch profile or a time-based profile and NVDA is configured to 
announce metadata streaming status.
 
 ## Version 18.01/15.12-LTS

Repository URL: https://bitbucket.org/nvdaaddonteam/stationplaylist/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.

Other related posts:

  • » commit/StationPlaylist: 46 new changesets - commits-noreply