Difference between revisions of "Linn Crestron Module"

From LinnDocs
Jump to: navigation, search
(Contents)
m (Location)
 
(21 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 +
= Update =
 +
 +
<u><b>This module has been replaced and can be found</b></u> [[DS_Control_Options#Crestron_with_Kazoo_Server|<u>here</u>]].<br><br>
 +
The new module above will also allow Tidal and Qobuz navigation.
 +
 +
If you do wish to use the earlier version then this can be downloaded from [http://legacy-oss.linn.co.uk/Tools/LinnSimplModule%20v4.32.zip <u>here</u>].<br><br>|
 +
 
= Overview =
 
= Overview =
  
Line 41: Line 48:
  
 
== Kazoo Integration ==
 
== Kazoo Integration ==
* For more complicated operations (i.e. playlist creation), the module provides integration with Kazoo.
+
* For more rich functionality (i.e. playlist creation), the module provides integration with Kazoo.
 
* It allows Kazoo to be opened directly to the selected room and view (i.e. music, radio, songcast, external inputs).
 
* It allows Kazoo to be opened directly to the selected room and view (i.e. music, radio, songcast, external inputs).
* It also provides an option to open Kazoo in Tidal browse mode as well.
+
* It also provides an option to open Kazoo in Tidal or Qobuz browse mode as well.
 
* Kazoo is opened with a button in the top left to quickly return to Crestron.
 
* Kazoo is opened with a button in the top left to quickly return to Crestron.
 
* The module also provides the ability to open the Linn device's configuration page in a web browser or jump directly to the TuneIn website for radio preset configuration.
 
* The module also provides the ability to open the Linn device's configuration page in a web browser or jump directly to the TuneIn website for radio preset configuration.
Line 51: Line 58:
 
= Download =
 
= Download =
  
== Location ==
+
<!--== Location ==
  
 
http://products.linn.co.uk/VersionInfo/Downloads/Releases/LinnCrestronModule_latest.zip
 
http://products.linn.co.uk/VersionInfo/Downloads/Releases/LinnCrestronModule_latest.zip
 +
 +
 +
[http://legacy-oss.linn.co.uk/Tools/LinnSimplModule v4.32.zip Update of SimplModule only V4.32]
 +
-->
  
 
== Contents ==
 
== Contents ==
  
=== CrestronStudioProgram ===
+
=== ExternalUrlSelector.usp ===  
 +
Small helper program for jumping to various Kazoo urls on mobile platforms.
  
A complete Crestron Studio project demonstrating the Linn Crestron module.  
+
=== LinnDsModule_SIMPL_Demo_CP3.smw ===
 +
A complete Simpl Windows project demonstrating the Linn Crestron module.  
  
This project includes a CP3 processor, 6 rooms and a sample iPad control application (which can toggle control between the 6 rooms).
+
This project includes a CP3 processor, 6 rooms and sample iPad and XPanel control applications (which can toggle control between the 6 rooms, created in Vt-Pro-e).
  
 
The rooms will need to have static IP addresses allocated to them (normally using a network router) and entered in the system setup.
 
The rooms will need to have static IP addresses allocated to them (normally using a network router) and entered in the system setup.
  
=== SimplWindowsProgram ===
+
=== LinnSimplModule vX.Y.umc ===
 +
The Linn simpl module that can be easily dropped in to any Crestron program.
  
A complete Simpl Windows project demonstrating the Linn Crestron module.  
+
=== LinnSimplModuleHelp_vX.Y.pdf ===
 +
A pdf file with a copy of the signal description documentation below.
 +
 
 +
=== LinnSimplPlusModule vX.Y.usp ===
 +
The Simpl+ program used for proving Linn functionality.
 +
 
 +
=== LinnSimplSharpModule.clz ===
 +
Compiled Simpl# code required by the Linn Simpl+ program.
  
This project includes a CP3 processor, 6 rooms and a sample iPad control application (which can toggle control between the 6 rooms). The GUI for the application created in Vt-Pro-e.
+
=== LinnVtpExample_MobileSG.vtp ===
 +
VT Pro example program for use with the Crestron App (mobile platforms i.e. iPad).
  
The rooms will need to have static IP addresses allocated to them (normally using a network router) and entered in the system setup.
+
=== LinnVtpExample_XPanelSG.vtp ===
 +
VT Pro example program for use with XPanel.
  
=== LinnSimplPlusModule ===
+
=== Lpec.cs ===
 +
Simpl# source, handles the bulk of the Lpec processing required for providing Linn functionality.
  
* '''LinnSimplPlusModule.usp/ush''': the Simpl+ program used for the Linn DS module.
+
== Release Notes ==
* '''ExternalUrlSelector.usp/ush''': small helper program for jumping to various Kazoo urls.
 
* '''LinnSimplSharpModule.clz''': compiled Simpl# code required by the Simpl+ program.
 
  
=== LinnSimplSharpModule ===
+
=== 4.3.1 (Released 16 Jul 2015) ===
 +
* Added support for international characters/fonts.
  
* '''Lpec.cs''': handles the bulk of the Lpec processing required for the Linn module.
+
=== 4.2.1 (Released 15 Jun 2015) ===
 +
* New and improved Simpl module.
 +
* New and improved Simpl Windows demo program which uses the new Simpl module.
 +
* New and improved VT Pro-e example control for mobile platforms.
 +
* New VT Pro-e example control for X-Panel.
 +
* Removed all UI formatting references from the Linn Simpl+ code.
 +
* Added Qobuz launch URL functionality.
 +
* Track playback duration now used to correctly track the progress of each track.
 +
* Fixed source selection bug (selecting internal sources via lists).
  
== Release Notes ==
+
=== 4.1.4 (Released 31 Mar 2015) ===
 +
* Disabled LPEC log messages from printing to the debug console.
  
 
=== 4.1.3 (Released 31 Mar 2015) ===
 
=== 4.1.3 (Released 31 Mar 2015) ===
Line 109: Line 141:
 
To get you started, each Linn DS or DSM in an installation needs a corresponding TCP/IP Client device to represent it – you must supply the static IP address of the DS/M (this must be allocated, normally using a network router).
 
To get you started, each Linn DS or DSM in an installation needs a corresponding TCP/IP Client device to represent it – you must supply the static IP address of the DS/M (this must be allocated, normally using a network router).
 
   
 
   
The device then needs to be connected as per the image below. The signal names correspond to the signal names in the Linn module.
+
The device then needs to be connected as per the image below. The signal names correspond to the signal names in the Linn Simpl module.
 
   
 
   
[[Image:CrestronBlock.jpg|550px|Connection]]
+
[[Image:CrestronBlock.png|550px|Connection]]
  
  TCP/IP Client Linn Simpl Plus Module Type
+
  TCP/IP Client Linn Simpl Module Type
 
  -------------    ---------------------------- ------
 
  -------------    ---------------------------- ------
  Connect                doConnect                      DIGITAL_OUTPUT
+
  Connect                Lpec_Connect                  DIGITAL_OUTPUT
  TX$ soLpecTxRoom[1]         STRING_OUTPUT
+
  TX$ LpecRoom1/Main_tx$ STRING_OUTPUT
  
  Connect-F diConnectedRoom[1] DIGITAL_INPUT  
+
  Connect-F LpecRoom1/Main_Connected DIGITAL_INPUT  
 
  status                                 N/C
 
  status                                 N/C
  RX$ biLpecRxRoom[1]         BUFFER_INPUT
+
  RX$ LpecRoom1/Main_rx$ BUFFER_INPUT
  
You should no longer need to worry about the LPEC command format (i.e. ACTION Ds/Volume...) as the module handles this for you. To establish volume control, you would just need to use the following from the Linn simpl plus module:
+
You should no longer need to worry about the LPEC command format (i.e. ACTION Ds/Volume...) as the module handles this for you. To establish volume control, you would just need to use the following from the Linn simpl module:
  
  aiVolume: supply an integer value to set the volume on the DS (ANALOG_INPUT)
+
  SetVolumeLevel#: supply an integer value to set the volume on the DS (ANALOG_INPUT)
  aoVolume: provides feedback from the DS as to its current volume (ANALOG_OUTPUT)
+
  VolumeLevel#: provides feedback from the DS as to its current volume (ANALOG_OUTPUT)
  
 
== Simpl+ Constants ==
 
== Simpl+ Constants ==
Line 139: Line 171:
 
== Signal Descriptions ==
 
== Signal Descriptions ==
  
=== Digital Inputs ===
+
=== Connection ===
''MAIN ROOM''
+
 
* diStandbyToggle - toggle the standby state of the main room
+
{| border="1" cellspacing="0" cellpadding="4"
* diStandbyOn - put main room into standby
+
|-style="font-weight:bold;background:#6699CC"
* diStandbyOff - bring main room out of standby
+
|Input||Description|| ||Output||Description
* diVolumeInc - increment volume of main room by 1dB
+
|- valign="top" align="left" style="font-size:90%"
* diVolumeDec - decrement volume of main room by 1dB
+
! LpecRoom1/Main_Connected
* diMuteToggle - toggle the mute state of the main room
+
| Connect to the TCP/IP Connect-F signal for the main room (Room 1) ||
* diMuteOn - mute the main room
+
! Lpec_Connect
* diMuteOff - umute the main room
+
| Connect to the TCP/IP Connect signal for '''''each''''' room
* diPlay - start playback in the main room
+
|- valign="top" align="left" style="font-size:90%"
* diPause - pause playback in the main room
+
! [LpecRoomX_Connected]
* diStop - stop playback in the main room
+
| Connect to the TCP/IP Connect-F signal for the given room (X = 2 to ciROOMCOUNT)||
* diNext - select the next track/channel in the main room
+
!
* diPrev - select the previous track/channel in the main room
+
|
* diFwd - seek forward on the current track/channel by ciSEEKSECONDS
+
|- valign="top" align="left" style="font-size:90%"
* diRew - seek backward on the current track/channel by ciSEEKSECONDS
+
! LpecRoom1/Main_rx$
* diShuffleToggle - toggle the shuffle state of the main room
+
| Connect to the TCP/IP RX$ signal for the main room (Room 1)||
* diShuffleOn - put main room into shuffle mode
+
! LpecRoom1/Main_tx$
* diShuffleOff - bring main room out of shuffle mode
+
| Connect to the TCP/IP TX$ signal for the main room (Room 1)
* diRepeatToggle - toggle the repeat state of the main room
+
|- valign="top" align="left" style="font-size:90%"
* diRepeatOn - put main room into repeat mode
+
! [LpecRoomX_rx$]
* diRepeatOff - bring main room out of repeat mode
+
| Connect to the TCP/IP RX$ signal for the given room (X = 2 to ciROOMCOUNT)||
* diTimeModeToggle - toggle the time output mode between elapsed and remaining (see soTime)
+
! [LpecRoomX_tx$]
* diRefresh - refresh the current state of all signals (performs and disconnect then reconnect)
+
| Connect to the TCP/IP TX$ signal for the given room (X = 2 to ciROOMCOUNT)
''MULTI-ROOM''
+
|- valign="top" align="left" style="font-size:90%"
* diConnectedRoom[ciROOMCOUNT] - connect to the TCP/IP Connect-F signal for the given room
+
! [Refresh]
* diListenToRoom[ciROOMCOUNT] - select the given room that the main room will lsiten to (Songcast)
+
| Refresh the current state of all signals (performs a disconnect then reconnect)||
* diVolumeIncRoom[ciROOMCOUNT] - increment volume of the given room by 1dB
+
! [HasProxyPreamp_fb]
* diVolumeDecRoom[ciROOMCOUNT] - decrement volume of the given room by 1dB
+
| Flag to determine if a separate preamp device is connected over RS232 as a proxy device
* diMuteToggleRoom[ciROOMCOUNT] - toggle the mute state of the given room
+
|- valign="top" align="left" style="font-size:90%"
* diMuteOnRoom[ciROOMCOUNT] - mute the given room
+
|}
* diMuteOffRoom[ciROOMCOUNT] - umute the given room
+
 
* diStandbyToggleRoom[ciROOMCOUNT] - toggle the standby state of the given room
+
=== Main ===
* diStandbyOnRoom[ciROOMCOUNT] - put the given room into standby
+
{| border="1" cellspacing="0" cellpadding="4"
* diStandbyOffRoom[ciROOMCOUNT] - bring the given room out of standby
+
|-style="font-weight:bold;background:#6699CC"
* diRoomSwapRoom[ciROOMCOUNT] - make the given room the main room
+
|Input||Description|| ||Output||Description
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [StandbyToggle]
 +
| Toggle the standby state of the main room||
 +
! [Standby_fb]
 +
| The standby state of the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! StandbyOn
 +
| Put main room into standby||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! StandbyOff
 +
| Bring main room out of standby||
 +
! [RoomName$]
 +
| The user configured name of the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! VolumeInc
 +
| Increment volume of main room by 1dB||
 +
! [HasVolume_fb]
 +
| Flag to determine if volume functions are currently available for the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! VolumeDec
 +
| Decrement volume of main room by 1dB||
 +
! [VolumeLevel$]
 +
| The volume level in the main room as a string
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [SetVolumeLevel#]
 +
| Set the volume level of the main room (0 to 100, 1dB steps)||
 +
! [VolumeLevel#]
 +
| The volume level of the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! MuteToggle
 +
| Toggle the mute state of the main room||
 +
! [Mute_fb]
 +
| The mute state of the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [MuteOn]
 +
| Mute the main room||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [MuteOff]
 +
| Unmute the main room||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [SourceCount#]
 +
| The number of sources available in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! SetSource#
 +
| Select the given source index in the main room (1 to ciMAXSOURCES)||
 +
! [SourceIndex#]
 +
| The currently selected source index in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [SourceIndexDeselect#]
 +
| The source index in the main room that is no longer selected (used to reflect when an invisible source has been selected by the user)
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [CurrentSource$]
 +
| The name of the current source in the main room
 +
|}
 +
 
 +
=== Transports ===
 +
{| border="1" cellspacing="0" cellpadding="4"
 +
|-style="font-weight:bold;background:#6699CC"
 +
|Input||Description|| ||Output||Description
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [Play]
 +
| Start playback in the main room||
 +
! [IsPlayable_fb]
 +
| Flag to determine if play function is currently available
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [Pause]
 +
| Pause playback in the main room||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [Stop]
 +
| Stop playback in the main room||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [Next]
 +
| Select the next track/channel in the main room||
 +
! [IsSkippable_fb]
 +
| Flag to determine if skip (next/previous) functions are currently available
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [Prev]
 +
| Select the previous track/channel in the main room||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [Fwd]
 +
| Seek forward on the current track/channel by ciSEEKSECONDS||
 +
! [IsSeekable_fb]
 +
| Flag to determine if time seek functions are currently available
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [Rew]
 +
| Seek backward on the current track/channel by ciSEEKSECONDS||
 +
!
 +
|
 +
|}
 +
 
 +
=== Now Playing ===
 +
 
 +
{| border="1" cellspacing="0" cellpadding="4"
 +
|-style="font-weight:bold;background:#6699CC"
 +
|Input||Description|| ||Output||Description
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [ShuffleToggle]
 +
| Toggle the shuffle state of the main room||
 +
! [ShuffleOn_fb]
 +
| The shuffle state of the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [ShuffleOn]
 +
| Put main room into shuffle mode||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [ShuffleOff]
 +
| Bring main room out of shuffle mode||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [RepeatToggle]
 +
| Toggle the repeat state of the main room||
 +
! [RepeatOn_fb]
 +
| The repeat state of the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [RepeatOn]
 +
| Put main room into repeat mode||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [RepeatOff]
 +
| Bring main room out of repeat mode||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [RadioSourceSelected_fb]
 +
| Flag for radio source being selected in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [PlaylistSourceSelected_fb]
 +
| Flag for playlist source being selected in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [SongcastSourceSelected_fb]
 +
| Flag for songcast source being selected in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [ChannelCount#]
 +
| The number of Radio channels (presets) available in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [SetChannel#]
 +
| Select the given channel index in the main room (1 to ciMAXCHANNELS)||
 +
! [ChannelIndex#]
 +
| The currently selected channel index in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [ChannelIndexDeselect#]
 +
| The channel index in the main room that is no longer selected (used to reflect when a non-indexed channel has been selected by the user)
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [TrackCount#]
 +
| The number of tracks available in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [SetTrack#]
 +
| Select the given track index in the main room (1 to ciMAXTRACKS)||
 +
! [TrackIndex#]
 +
| The currently selected track index in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [TrackIndexDeselect#]
 +
| The track index in the main room that is no longer selected (used to reflect when a non-indexed track has been selected by the user)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [TimeModeToggle]
 +
| Toggle the time output mode between elapsed and remaining (see Time$)||
 +
! [Duration#]
 +
| The length in time (in seconds) of the current track in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [SetTimeInSeconds#]
 +
| Seek to the given second in the current track||
 +
! [TimeInSeconds#]
 +
| The current time (in seconds) of the current track in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [CurrentSender$]
 +
| The name of the current songcast sender the main room is listening to
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [Time$]
 +
| The time of the current track in the main room as a string ('0:00:00' or '-0:00:00' depending on TimeModeToggle)
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [ArtworkUrl$]
 +
| The URL of the artwork for the current track in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [Composer$]
 +
| The composer of the current track in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [Title$]
 +
| The title of the current track in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [Artist$]
 +
| The artist of the current track in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [ArtistAndComposer$]
 +
| The artist and composer of the current track in the main room. Format is 'Artist Name (composed by: Composer Name)'. If no composer listed, format is 'Artist Name'
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [Album$]
 +
| The album of the current track in the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [Details$]
 +
| The details of the current track in the main room (i.e. 'FLAC 96 kHz / 24 bits 4609 kbps')
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [TransportState$]
 +
| The current transport state of the main room (playing/paused/stopped/waiting/buffering)
 +
|}
 +
 
 +
=== Launch URLs ===
 +
 
 +
{| border="1" cellspacing="0" cellpadding="4"
 +
|-style="font-weight:bold;background:#6699CC"
 +
|Input||Description|| ||Output||Description
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [ConfigurationUrl$]
 +
| The URL used to open the configuration page of the main room
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [ConfigurationUrlProxy$]
 +
| The URL used to open the configuration page of the optional proxy preamp connected to the main room over RS232 (see HasProxyPreamp_fb)
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [KazooUrl$]
 +
| The URL used to open Kazoo in source mode (mobile only). Kazoo opens in the following state: selected main room as the focus device, source view of the current source selected in the main room (playlist/radio/songcast/inputs), 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [KazooTidalUrl$]
 +
| The URL used to open Kazoo in Tidal mode (mobile only). Kazoo opens in the following state: selected main room as the focus device, Tidal browse/search view, 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [KazooQobuzUrl$]
 +
| The URL used to open Kazoo in Qobuz mode (mobile only). Kazoo opens in the following state: selected main room as the focus device, Qobuz browse/search view, 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [TuneInUrl$]
 +
| The URL to open the TuneIn website to setup radio presets
 +
|}
 +
 
 +
=== Multiroom ===
 +
{| border="1" cellspacing="0" cellpadding="4"
 +
|-style="font-weight:bold;background:#6699CC"
 +
|Input||Description|| ||Output||Description
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [StandbyToggleRoomX]
 +
| Toggle the standby state of the given room (X = 1 to ciROOMCOUNT)||
 +
! [StandbyRoomX_fb]
 +
| The standby state of the given room (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [StandbyOnRoomX]
 +
| Put the given room into standby (X = 1 to ciROOMCOUNT)||
 +
! [RoomXSelectable_fb]
 +
| Flag to determine if the given room is available to be selected as the main room (i.e. device powered on and not already selected as the main room) (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [StandbyOffRoomX]
 +
| Bring the given room out of standby (X = 1 to ciROOMCOUNT)||
 +
! [RoomNameRoomX$]
 +
| The user configured name of the given room (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [ListenToRoomX]
 +
| Select the given room that the main room will listen to via Songcast (X = 1 to ciROOMCOUNT)||
 +
! [RoomXSelected_fb]
 +
| Flag to determine if the given room is currently selected as the main room. The main room can not select itself to listen to as a Songcast sender (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
!
 +
| ||
 +
! [RoomXAvailableAsSongcastSender_fb]
 +
| Flag to determine if the given room can be listened to as a Songcast sender (will always be false for preamp only devices) (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [VolumeIncRoomX]
 +
| Increment volume of the given room by 1dB (X = 1 to ciROOMCOUNT)||
 +
! [HasVolumeRoomX_fb]
 +
| Flag to determine if volume functions are currently available for the given room (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [VolumeDecRoomX]
 +
| Decrement volume of the given room by 1dB (X = 1 to ciROOMCOUNT)||
 +
! [VolumeLevelRoomX$]
 +
| The volume level in the given room as a string (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [SetVolumeLevelRoomX#]
 +
| Set the volume level of the given room (0 to 100, 1dB steps) (X = 1 to ciROOMCOUNT)||
 +
! [VolumeLevelRoomX#]
 +
| The volume level of the given room (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [MuteToggleRoomX]
 +
| Toggle the mute state of the given room (X = 1 to ciROOMCOUNT)||
 +
! [MuteRoomX_fb]
 +
| The mute state of the given room (X = 1 to ciROOMCOUNT)
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [MuteOnRoomX]
 +
| Mute the given room (X = 1 to ciROOMCOUNT)||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [MuteOffRoomX]
 +
| Unmute the given room (X = 1 to ciROOMCOUNT)||
 +
!
 +
|
 +
|- valign="top" align="left" style="font-size:90%"
 +
! [RoomSwapRoomX]
 +
| Make the given room the main room (X = 1 to ciROOMCOUNT)||
 +
! [CurrentSourceRoomX$]
 +
| The name of the current source in the given room
 +
|}
 +
 
 +
=== Source Names ===
  
=== Analog Inputs ===
+
{| border="1" cellspacing="0" cellpadding="4" width="100%"
''MAIN ROOM''
+
|-style="font-weight:bold;background:#6699CC"
* aiVolume - set the volume level of the main room (0 to 100, 1dB steps)
+
|Input||Description|| ||Output||Description
* aiSource - select the given source index in the main room (0 to ciMAXSOURCES)
+
|- valign="top" align="left" style="font-size:90%"
* aiChannel - select the given channel index in the main room (0 to ciMAXCHANNELS)
+
!
* aiTrack - select the given track index in the main room (0 to ciMAXTRACKS)
+
| ||
* aiSeconds - seek to the given second in current track
+
! [SourceXName$]
''MULTI-ROOM''
+
| Source name by source index for creating a selectable list of sources for the main room (X = 1 to ciMAXSOURCES)
* aiVolumeRoom[ciROOMCOUNT] - set the volume level of the given room (0 to 100, 1dB steps)
+
|}
  
=== Buffer Inputs ===
+
=== Channel Names ===
''MULTI-ROOM''
 
biLpecRxRoom[ciROOMCOUNT] - connect to the TCP/IP RX$ signal for the given room
 
  
=== Digital Outputs ===
+
{| border="1" cellspacing="0" cellpadding="4" width="100%"
''MAIN ROOM''
+
|-style="font-weight:bold;background:#6699CC"
* doMute - the mute state of the main room
+
|Input||Description|| ||Output||Description
* doStandby - the standby state of the main room
+
|- valign="top" align="left" style="font-size:90%"
* doShuffle - the shuffle state of the main room
+
!
* doRepeat - the repeat state of the main room
+
| ||
* doRadioSourceSelected - flag for radio source being selected in the main room
+
! [ChannelXName$]
* doPlaylistSourceSelected - flag for playlist source being selected in the main room
+
| Channel name by channel index for creating a selectable list of radio channels (aka presets) for the main room (format is '1. Linn Radio (Eclectic)') (X = 1 to ciMAXSOURCES)
* doSongcastSourceSelected - flag for songcast source being selected in the main room
+
|}
* doIsPlayable - flag to determine if play function is currently available
 
* doIsSeekable - flag to determine if time seek functions are currently available
 
* doIsSkippable - flag to determine if skip (next/previous) functions are currently available
 
* doHasVolume - flag to determine if volume functions are currently available for the main room
 
* doHasProxyPreamp - flag to determine if a separate preamp device is connected over RS232 as a proxy device.
 
* doConnect - connect to the TCP/IP Connect signal for each room
 
''MULTI-ROOM''
 
* doRoomSelected[ciROOMCOUNT] - flag to determine if the given room is currently selected as the main room
 
: NOTE: main room can not select itself to listen to as a Songcast sender
 
* doRoomAvailableAsSongcastSender[ciRoomCount] - flag to determine if the given room can be listened to as a Songcast sender
 
: NOTE: will always be false for preamp only devices
 
* doRoomSelectable[ciRoomCount] - flag to determine if the given room is available to be selected as the main room
 
: NOTE: device powered on and not already selected as the main room
 
* doMuteRoom[ciROOMCOUNT] - the mute state of the given room
 
* doHasVolumeRoom[ciROOMCOUNT] - flag to determine if volume functions are currently available for the given room
 
* doStandbyRoom[ciROOMCOUNT] - the standby state of the given room
 
  
=== Analog Outputs ===
+
=== Track Names ===
''MAIN ROOM''
 
* aoVolume - the volume level of the main room
 
* aoSourceCount - the number of sources available in the main room
 
* aoSourceIndex - the currently selected source index in the main room
 
* aoSourceIndexDeselect - the source index in the main room that is no longer selected (for use with a source list if the source has been changed using another control mechanism)
 
* aoChannelCount - the number of Radio channels (presets) available in the main room
 
* aoChannelIndex - the currently selected channel index in the main room
 
* aoChannelIndexDeselect - the channel index in the main room that is no longer selected (for use with a channel list if the channel has been changed using another control mechanism)
 
* aoTrackCount - the number of tracks available in the main room
 
* aoTrackIndex - the currently selected track index in the main room
 
* aoTrackIndexDeselect - the track index in the main room that is no longer selected (for use with a track list if the track has been changed using another control mechanism)
 
* aoDuration - the length in time (in seconds) of the current track in the main room
 
* aoSeconds - the current time (in seconds) of the current track in the main room
 
''MULTI-ROOM''
 
* aoVolumeRoom[ciROOMCOUNT] - the volume level of the given room
 
  
=== String Outputs ===
+
{| border="1" cellspacing="0" cellpadding="4" width="100%"
''MAIN ROOM''
+
|-style="font-weight:bold;background:#6699CC"
* soCurrentSource - the name of the current source in the main room
+
|Input||Description|| ||Output||Description
* soCurrentSender - the name of the current songcast sender the main room is listening to
+
|- valign="top" align="left" style="font-size:90%"
* soTime - the time of the current track in the main room as a string ('0:00:00')
+
!
* soVolume - the volume level in the main room as a string
+
| ||
* soRoomName - the user configured name of the main room
+
! [TrackXName$]
* soArtworkUrl - the URL of the artwork for the current track in the main room
+
| Track name by track index for creating a selectable list of tracks for the main room (format is '1. Marooned (Pink Floyd - The Division Bell)') (X = 1 to ciMAXSOURCES)
* soComposer - the composer of the current track in the main room
+
|}
* soTitle - the title of the current track in the main room
 
* soArtist - the artist of the current track in the main room
 
* soArtistAndComposer - the artist and composer of the current track in the main room
 
: NOTE: format is 'Artist Name (composed by: Composer Name)'
 
: NOTE: if no composer listed, format is 'Artist Name'
 
* soAlbum - the album of the current track in the main room
 
* soDetails - the details of the current track in the main room (i.e. 'FLAC 96 kHz / 24 bits 4609 kbps')
 
* soTransportState - the current transport state of the main room (playing/paused/stopped/wiating/buffering)
 
* soConfigurationUrl - the URL used to open the configuration page of the main room
 
* soConfigurationUrlProxy - the URL used to open the configuration page of the optional proxy preamp connected to the main room over RS232
 
* soKazooUrl - the URL used to open Kazoo in source mode
 
: NOTE: will open Kazoo with the selected main room as the focus device
 
: NOTE: will open Kazoo to the source view of the current source selected in the main room (playlist/radio/songcast/inputs)
 
: NOTE: will open Kazoo with a 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
 
* soKazooTidalUrl - the URL used to open Kazoo in Tidal mode
 
: NOTE: will open Kazoo with the selected main room as the focus device
 
: NOTE: will open Kazoo to the Tidal browse/search view
 
: NOTE: will open Kazoo with a 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
 
* soTuneInUrl - the URL to open the TuneIn website to setup radio presets
 
''MULTI-ROOM''
 
* soLpecTxRoom[ciROOMCOUNT] - connect to the TCP/IP TX$ signal for the given room
 
* soVolumeRoom[ciROOMCOUNT] - the volume level in the given room as a string
 
* soRoomNameRoom[ciROOMCOUNT] - the user configured name of the given room
 
* soCurrentSourceRoom[ciROOMCOUNT] - the name of the current source in the given room
 
* soSourceName[ciMAXSOURCES] - the list of source names by source index room for creating a selectable list of sources for the main room
 
* soChannelName[ciMAXCHANNELS] - the list of channel names by channel index for creating a selectable list of radio channels (aka presets) for the main room
 
: NOTE: format is '1. Linn Radio (Eclectic)'
 
* soTrackName[ciMAXTRACKS] - the list of track names by track index room for creating a selectable list of tracksfor the main room
 
: NOTE: format is '1. '''Marooned'''  Pink Floyd - The Division Bell'
 

Latest revision as of 09:22, 16 February 2021

Update

This module has been replaced and can be found here.

The new module above will also allow Tidal and Qobuz navigation.

If you do wish to use the earlier version then this can be downloaded from here.

|

Overview

The Linn Crestron module allows a Linn system to be easily added into a Crestron installation. It provides all basic functionality required for using your Linn DS or DSM. The module makes use of the LPEC protocol to allow your Linn device to communicate with a Crestron system.

Full source code for this module has been released and can be used as is or modified to suit any given installation.

The module was developed using a Crestron CP3 processor and will require that or better to function.

Sample Crestron Application: Basic Functionality

Basic Functionality (Main room)

All core control functions are available for the main room:

Sample Crestron Application: Track Selection
  • Standby
  • Volume and mute
  • Source selection
  • Playback commands (play, pause, stop, skip, seek, repeat, shuffle)
  • Track selection from existing playlist
  • Radio selection from preset list (as well as radio next and previous)


All core feedback is provided as well:

  • Album art
  • Track metadata
  • Track details
  • Time
  • Playback state
  • All other states (i.e. volume, mute, standby)

Multi-room

The module also provides multi-room control for a configurable number of other rooms in the house.

  • Select another room to listen to using Songcast.
  • Change volume, mute and standby on all Linn devices from one place.
  • Toggle which Linn device is the main room for further control.
  • Tested with a six room installation but more can be added.

Sample Crestron Application: Multi-room Control

Kazoo Integration

  • For more rich functionality (i.e. playlist creation), the module provides integration with Kazoo.
  • It allows Kazoo to be opened directly to the selected room and view (i.e. music, radio, songcast, external inputs).
  • It also provides an option to open Kazoo in Tidal or Qobuz browse mode as well.
  • Kazoo is opened with a button in the top left to quickly return to Crestron.
  • The module also provides the ability to open the Linn device's configuration page in a web browser or jump directly to the TuneIn website for radio preset configuration.

Sample Crestron Application: Kazoo Integration

Download

Contents

ExternalUrlSelector.usp

Small helper program for jumping to various Kazoo urls on mobile platforms.

LinnDsModule_SIMPL_Demo_CP3.smw

A complete Simpl Windows project demonstrating the Linn Crestron module.

This project includes a CP3 processor, 6 rooms and sample iPad and XPanel control applications (which can toggle control between the 6 rooms, created in Vt-Pro-e).

The rooms will need to have static IP addresses allocated to them (normally using a network router) and entered in the system setup.

LinnSimplModule vX.Y.umc

The Linn simpl module that can be easily dropped in to any Crestron program.

LinnSimplModuleHelp_vX.Y.pdf

A pdf file with a copy of the signal description documentation below.

LinnSimplPlusModule vX.Y.usp

The Simpl+ program used for proving Linn functionality.

LinnSimplSharpModule.clz

Compiled Simpl# code required by the Linn Simpl+ program.

LinnVtpExample_MobileSG.vtp

VT Pro example program for use with the Crestron App (mobile platforms i.e. iPad).

LinnVtpExample_XPanelSG.vtp

VT Pro example program for use with XPanel.

Lpec.cs

Simpl# source, handles the bulk of the Lpec processing required for providing Linn functionality.

Release Notes

4.3.1 (Released 16 Jul 2015)

  • Added support for international characters/fonts.

4.2.1 (Released 15 Jun 2015)

  • New and improved Simpl module.
  • New and improved Simpl Windows demo program which uses the new Simpl module.
  • New and improved VT Pro-e example control for mobile platforms.
  • New VT Pro-e example control for X-Panel.
  • Removed all UI formatting references from the Linn Simpl+ code.
  • Added Qobuz launch URL functionality.
  • Track playback duration now used to correctly track the progress of each track.
  • Fixed source selection bug (selecting internal sources via lists).

4.1.4 (Released 31 Mar 2015)

  • Disabled LPEC log messages from printing to the debug console.

4.1.3 (Released 31 Mar 2015)

  • Added a Simpl Windows demo program.
  • Added a VT Pro-e example GUI for demonstrating the full range of functionality.
  • Added a Simpl module that wraps the Simpl+ module.
  • Fixed bug in main processing loop that was causing CPU usage to go very high.
  • Fixed bug where source count and source index with an RS232 connected preamp could become out of sync.

4.1.2 (Released 27 Jan 2015)

  • Fixed bug on opening Kazoo from Crestron module when the selected room contains spaces in the room name.

4.1.1 (Released 26 Jan 2015)

  • Initial release of the Linn Crestron Module.
  • Includes support for all Linn products including DS and DSM at Davaar level.
  • Also handles connections with legacy preamp devices (i.e. Klimax Kontrol, Akurate Kontrol, etc).
  • Includes multi-room support (tested with 6 rooms but can handle more).
  • Includes Kazoo URL integration (jump to Kazoo which will present a back to Crestron button).

Getting Started

The demonstration programs using your preferred Crestron development environment (Crestron Studio or Simpl Windows/VT Pro-e) is the best way to see what the module is capable of and to help you get up and running with it.

Basic Setup

To get you started, each Linn DS or DSM in an installation needs a corresponding TCP/IP Client device to represent it – you must supply the static IP address of the DS/M (this must be allocated, normally using a network router).

The device then needs to be connected as per the image below. The signal names correspond to the signal names in the Linn Simpl module.

Connection

TCP/IP Client		Linn Simpl Module		Type
-------------    	----------------------------	------
Connect                 Lpec_Connect                   DIGITAL_OUTPUT
TX$			LpecRoom1/Main_tx$		STRING_OUTPUT
Connect-F		LpecRoom1/Main_Connected	DIGITAL_INPUT 
status		 	                                N/C
RX$		 	LpecRoom1/Main_rx$		BUFFER_INPUT

You should no longer need to worry about the LPEC command format (i.e. ACTION Ds/Volume...) as the module handles this for you. To establish volume control, you would just need to use the following from the Linn simpl module:

SetVolumeLevel#: supply an integer value to set the volume on the DS (ANALOG_INPUT)
VolumeLevel#: provides feedback from the DS as to its current volume (ANALOG_OUTPUT)

Simpl+ Constants

#DEFINE_CONSTANT ciROOMCOUNT 6 // number of rooms for module (including main room)
#DEFINE_CONSTANT ciMAINROOMINITIAL 1 // main room number (will boot to this initially)
#DEFINE_CONSTANT ciMAXSOURCES 50 // can be decreased as required
#DEFINE_CONSTANT ciMAXCHANNELS 100 // radio stations/presets referred to as channels
#DEFINE_CONSTANT ciMAXTRACKS 1000 // playlist
#DEFINE_CONSTANT ciSEEKSECONDS 20 // number of seconds to jump for each seek button press
#DEFINE_CONSTANT ciUSEVISIBLESOURCESONLY ciTRUE // true: use only configured visible sources
                                                // false: always use all sources

Signal Descriptions

Connection

Input Description Output Description
LpecRoom1/Main_Connected Connect to the TCP/IP Connect-F signal for the main room (Room 1) Lpec_Connect Connect to the TCP/IP Connect signal for each room
[LpecRoomX_Connected] Connect to the TCP/IP Connect-F signal for the given room (X = 2 to ciROOMCOUNT)
LpecRoom1/Main_rx$ Connect to the TCP/IP RX$ signal for the main room (Room 1) LpecRoom1/Main_tx$ Connect to the TCP/IP TX$ signal for the main room (Room 1)
[LpecRoomX_rx$] Connect to the TCP/IP RX$ signal for the given room (X = 2 to ciROOMCOUNT) [LpecRoomX_tx$] Connect to the TCP/IP TX$ signal for the given room (X = 2 to ciROOMCOUNT)
[Refresh] Refresh the current state of all signals (performs a disconnect then reconnect) [HasProxyPreamp_fb] Flag to determine if a separate preamp device is connected over RS232 as a proxy device

Main

Input Description Output Description
[StandbyToggle] Toggle the standby state of the main room [Standby_fb] The standby state of the main room
StandbyOn Put main room into standby
StandbyOff Bring main room out of standby [RoomName$] The user configured name of the main room
VolumeInc Increment volume of main room by 1dB [HasVolume_fb] Flag to determine if volume functions are currently available for the main room
VolumeDec Decrement volume of main room by 1dB [VolumeLevel$] The volume level in the main room as a string
[SetVolumeLevel#] Set the volume level of the main room (0 to 100, 1dB steps) [VolumeLevel#] The volume level of the main room
MuteToggle Toggle the mute state of the main room [Mute_fb] The mute state of the main room
[MuteOn] Mute the main room
[MuteOff] Unmute the main room
[SourceCount#] The number of sources available in the main room
SetSource# Select the given source index in the main room (1 to ciMAXSOURCES) [SourceIndex#] The currently selected source index in the main room
[SourceIndexDeselect#] The source index in the main room that is no longer selected (used to reflect when an invisible source has been selected by the user)
[CurrentSource$] The name of the current source in the main room

Transports

Input Description Output Description
[Play] Start playback in the main room [IsPlayable_fb] Flag to determine if play function is currently available
[Pause] Pause playback in the main room
[Stop] Stop playback in the main room
[Next] Select the next track/channel in the main room [IsSkippable_fb] Flag to determine if skip (next/previous) functions are currently available
[Prev] Select the previous track/channel in the main room
[Fwd] Seek forward on the current track/channel by ciSEEKSECONDS [IsSeekable_fb] Flag to determine if time seek functions are currently available
[Rew] Seek backward on the current track/channel by ciSEEKSECONDS

Now Playing

Input Description Output Description
[ShuffleToggle] Toggle the shuffle state of the main room [ShuffleOn_fb] The shuffle state of the main room
[ShuffleOn] Put main room into shuffle mode
[ShuffleOff] Bring main room out of shuffle mode
[RepeatToggle] Toggle the repeat state of the main room [RepeatOn_fb] The repeat state of the main room
[RepeatOn] Put main room into repeat mode
[RepeatOff] Bring main room out of repeat mode
[RadioSourceSelected_fb] Flag for radio source being selected in the main room
[PlaylistSourceSelected_fb] Flag for playlist source being selected in the main room
[SongcastSourceSelected_fb] Flag for songcast source being selected in the main room
[ChannelCount#] The number of Radio channels (presets) available in the main room
[SetChannel#] Select the given channel index in the main room (1 to ciMAXCHANNELS) [ChannelIndex#] The currently selected channel index in the main room
[ChannelIndexDeselect#] The channel index in the main room that is no longer selected (used to reflect when a non-indexed channel has been selected by the user)
[TrackCount#] The number of tracks available in the main room
[SetTrack#] Select the given track index in the main room (1 to ciMAXTRACKS) [TrackIndex#] The currently selected track index in the main room
[TrackIndexDeselect#] The track index in the main room that is no longer selected (used to reflect when a non-indexed track has been selected by the user)
[TimeModeToggle] Toggle the time output mode between elapsed and remaining (see Time$) [Duration#] The length in time (in seconds) of the current track in the main room
[SetTimeInSeconds#] Seek to the given second in the current track [TimeInSeconds#] The current time (in seconds) of the current track in the main room
[CurrentSender$] The name of the current songcast sender the main room is listening to
[Time$] The time of the current track in the main room as a string ('0:00:00' or '-0:00:00' depending on TimeModeToggle)
[ArtworkUrl$] The URL of the artwork for the current track in the main room
[Composer$] The composer of the current track in the main room
[Title$] The title of the current track in the main room
[Artist$] The artist of the current track in the main room
[ArtistAndComposer$] The artist and composer of the current track in the main room. Format is 'Artist Name (composed by: Composer Name)'. If no composer listed, format is 'Artist Name'
[Album$] The album of the current track in the main room
[Details$] The details of the current track in the main room (i.e. 'FLAC 96 kHz / 24 bits 4609 kbps')
[TransportState$] The current transport state of the main room (playing/paused/stopped/waiting/buffering)

Launch URLs

Input Description Output Description
[ConfigurationUrl$] The URL used to open the configuration page of the main room
[ConfigurationUrlProxy$] The URL used to open the configuration page of the optional proxy preamp connected to the main room over RS232 (see HasProxyPreamp_fb)
[KazooUrl$] The URL used to open Kazoo in source mode (mobile only). Kazoo opens in the following state: selected main room as the focus device, source view of the current source selected in the main room (playlist/radio/songcast/inputs), 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
[KazooTidalUrl$] The URL used to open Kazoo in Tidal mode (mobile only). Kazoo opens in the following state: selected main room as the focus device, Tidal browse/search view, 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
[KazooQobuzUrl$] The URL used to open Kazoo in Qobuz mode (mobile only). Kazoo opens in the following state: selected main room as the focus device, Qobuz browse/search view, 'Crestron' button in the top left corner to jump back quickly to the native Crestron app
[TuneInUrl$] The URL to open the TuneIn website to setup radio presets

Multiroom

Input Description Output Description
[StandbyToggleRoomX] Toggle the standby state of the given room (X = 1 to ciROOMCOUNT) [StandbyRoomX_fb] The standby state of the given room (X = 1 to ciROOMCOUNT)
[StandbyOnRoomX] Put the given room into standby (X = 1 to ciROOMCOUNT) [RoomXSelectable_fb] Flag to determine if the given room is available to be selected as the main room (i.e. device powered on and not already selected as the main room) (X = 1 to ciROOMCOUNT)
[StandbyOffRoomX] Bring the given room out of standby (X = 1 to ciROOMCOUNT) [RoomNameRoomX$] The user configured name of the given room (X = 1 to ciROOMCOUNT)
[ListenToRoomX] Select the given room that the main room will listen to via Songcast (X = 1 to ciROOMCOUNT) [RoomXSelected_fb] Flag to determine if the given room is currently selected as the main room. The main room can not select itself to listen to as a Songcast sender (X = 1 to ciROOMCOUNT)
[RoomXAvailableAsSongcastSender_fb] Flag to determine if the given room can be listened to as a Songcast sender (will always be false for preamp only devices) (X = 1 to ciROOMCOUNT)
[VolumeIncRoomX] Increment volume of the given room by 1dB (X = 1 to ciROOMCOUNT) [HasVolumeRoomX_fb] Flag to determine if volume functions are currently available for the given room (X = 1 to ciROOMCOUNT)
[VolumeDecRoomX] Decrement volume of the given room by 1dB (X = 1 to ciROOMCOUNT) [VolumeLevelRoomX$] The volume level in the given room as a string (X = 1 to ciROOMCOUNT)
[SetVolumeLevelRoomX#] Set the volume level of the given room (0 to 100, 1dB steps) (X = 1 to ciROOMCOUNT) [VolumeLevelRoomX#] The volume level of the given room (X = 1 to ciROOMCOUNT)
[MuteToggleRoomX] Toggle the mute state of the given room (X = 1 to ciROOMCOUNT) [MuteRoomX_fb] The mute state of the given room (X = 1 to ciROOMCOUNT)
[MuteOnRoomX] Mute the given room (X = 1 to ciROOMCOUNT)
[MuteOffRoomX] Unmute the given room (X = 1 to ciROOMCOUNT)
[RoomSwapRoomX] Make the given room the main room (X = 1 to ciROOMCOUNT) [CurrentSourceRoomX$] The name of the current source in the given room

Source Names

Input Description Output Description
[SourceXName$] Source name by source index for creating a selectable list of sources for the main room (X = 1 to ciMAXSOURCES)

Channel Names

Input Description Output Description
[ChannelXName$] Channel name by channel index for creating a selectable list of radio channels (aka presets) for the main room (format is '1. Linn Radio (Eclectic)') (X = 1 to ciMAXSOURCES)

Track Names

Input Description Output Description
[TrackXName$] Track name by track index for creating a selectable list of tracks for the main room (format is '1. Marooned (Pink Floyd - The Division Bell)') (X = 1 to ciMAXSOURCES)