Difference between revisions of "Linn Crestron Module"

From LinnDocs
Jump to: navigation, search
(Getting Started)
Line 85: Line 85:
 
* Includes Kazoo URL integration (jump to Kazoo which will present a back to Crestron button).
 
* Includes Kazoo URL integration (jump to Kazoo which will present a back to Crestron button).
  
=== Getting Started ===
+
== Getting Started ==
  
 
Using Crestron Studio is ideal as the complete example makes everything more straightforward. However, there should be no problem using the Linn module in simpl windows.
 
Using Crestron Studio is ideal as the complete example makes everything more straightforward. However, there should be no problem using the Linn module in simpl windows.
 
   
 
   
==== Basic Setup ====
+
=== 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.
 
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.
 
   
 
   
Line 110: Line 110:
 
  aoVolume: provides feedback from the DS as to its current volume (ANALOG_OUTPUT)
 
  aoVolume: provides feedback from the DS as to its current volume (ANALOG_OUTPUT)
  
==== Simpl+ Constants ====
+
=== Simpl+ Constants ===
 
  #DEFINE_CONSTANT ciROOMCOUNT 6 // number of rooms for module (including main room)
 
  #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 ciMAINROOMINITIAL 1 // main room number (will boot to this initially)
Line 120: Line 120:
 
                                                 // false: always use all sources
 
                                                 // false: always use all sources
  
==== Signal Descriptions ====
+
=== Signal Descriptions ===
  
===== Digital Inputs =====
+
==== Digital Inputs ====
  
 
DIGITAL_INPUT diStandbyToggle, diStandbyOn, diStandbyOff, diVolumeInc, diVolumeDec, diMuteToggle, diMuteOn, diMuteOff, diPlay, diPause, diStop, diNext, diPrev, diFwd, diRew, diShuffleToggle, diShuffleOn, diShuffleOff, diRepeatToggle, diRepeatOn, diRepeatOff, diTimeModeToggle, diRefresh;
 
DIGITAL_INPUT diStandbyToggle, diStandbyOn, diStandbyOff, diVolumeInc, diVolumeDec, diMuteToggle, diMuteOn, diMuteOff, diPlay, diPause, diStop, diNext, diPrev, diFwd, diRew, diShuffleToggle, diShuffleOn, diShuffleOff, diRepeatToggle, diRepeatOn, diRepeatOff, diTimeModeToggle, diRefresh;
 
DIGITAL_INPUT diConnectedRoom[ciROOMCOUNT], diListenToRoom[ciROOMCOUNT], diVolumeIncRoom[ciROOMCOUNT], diVolumeDecRoom[ciROOMCOUNT], diMuteToggleRoom[ciROOMCOUNT], diMuteOnRoom[ciROOMCOUNT], diMuteOffRoom[ciROOMCOUNT], diStandbyToggleRoom[ciROOMCOUNT], diStandbyOnRoom[ciROOMCOUNT], diStandbyOffRoom[ciROOMCOUNT], diRoomSwapRoom[ciROOMCOUNT, ciROOMCOUNT];
 
DIGITAL_INPUT diConnectedRoom[ciROOMCOUNT], diListenToRoom[ciROOMCOUNT], diVolumeIncRoom[ciROOMCOUNT], diVolumeDecRoom[ciROOMCOUNT], diMuteToggleRoom[ciROOMCOUNT], diMuteOnRoom[ciROOMCOUNT], diMuteOffRoom[ciROOMCOUNT], diStandbyToggleRoom[ciROOMCOUNT], diStandbyOnRoom[ciROOMCOUNT], diStandbyOffRoom[ciROOMCOUNT], diRoomSwapRoom[ciROOMCOUNT, ciROOMCOUNT];
  
===== Analog Inputs =====
+
==== Analog Inputs ====
  
 
aiVolume
 
aiVolume
Line 136: Line 136:
 
ANALOG_INPUT aiVolumeRoom[ciROOMCOUNT, ciROOMCOUNT];
 
ANALOG_INPUT aiVolumeRoom[ciROOMCOUNT, ciROOMCOUNT];
  
===== Buffer Inputs =====
+
==== Buffer Inputs ====
 
BUFFER_INPUT biLpecRxRoom[ciROOMCOUNT, ciROOMCOUNT][ciLPECRXSIZE];
 
BUFFER_INPUT biLpecRxRoom[ciROOMCOUNT, ciROOMCOUNT][ciLPECRXSIZE];
  
===== Digital Outputs =====
+
==== Digital Outputs ====
 
DIGITAL_OUTPUT doMute, doStandby, doShuffle, doRepeat, doRadioSourceSelected, doPlaylistSourceSelected, doSongcastSourceSelected, doIsPlayable, doIsSeekable, doIsSkippable, doHasVolume, doHasProxyPreamp, doConnect;
 
DIGITAL_OUTPUT doMute, doStandby, doShuffle, doRepeat, doRadioSourceSelected, doPlaylistSourceSelected, doSongcastSourceSelected, doIsPlayable, doIsSeekable, doIsSkippable, doHasVolume, doHasProxyPreamp, doConnect;
 
DIGITAL_OUTPUT doRoomSelected[ciROOMCOUNT], doRoomAvailableAsSongcastSender[ciRoomCount], doRoomSelectable[ciRoomCount], doMuteRoom[ciROOMCOUNT], doHasVolumeRoom[ciROOMCOUNT], doStandbyRoom[ciROOMCOUNT, ciROOMCOUNT];
 
DIGITAL_OUTPUT doRoomSelected[ciROOMCOUNT], doRoomAvailableAsSongcastSender[ciRoomCount], doRoomSelectable[ciRoomCount], doMuteRoom[ciROOMCOUNT], doHasVolumeRoom[ciROOMCOUNT], doStandbyRoom[ciROOMCOUNT, ciROOMCOUNT];
  
===== Analog Outputs =====
+
==== Analog Outputs ====
 
ANALOG_OUTPUT aoVolume, aoSourceCount, aoSourceIndex, aoSourceIndexDeselect, aoChannelCount, aoChannelIndex, aoChannelIndexDeselect, aoTrackCount, aoTrackIndex, aoTrackIndexDeselect, aoDuration, aoSeconds;
 
ANALOG_OUTPUT aoVolume, aoSourceCount, aoSourceIndex, aoSourceIndexDeselect, aoChannelCount, aoChannelIndex, aoChannelIndexDeselect, aoTrackCount, aoTrackIndex, aoTrackIndexDeselect, aoDuration, aoSeconds;
 
ANALOG_OUTPUT aoVolumeRoom[ciROOMCOUNT, ciROOMCOUNT];
 
ANALOG_OUTPUT aoVolumeRoom[ciROOMCOUNT, ciROOMCOUNT];
  
===== String Outputs =====
+
==== String Outputs ====
 
STRING_OUTPUT soCurrentSource, soCurrentSender, soTime, soVolume, soRoomName, soArtworkUrl, soComposer, soTitle, soArtist, soArtistAndComposer, soAlbum, soDetails, soTransportState, soConfigurationUrl, soConfigurationUrlProxy, soKazooUrl, soKazooTidalUrl, soTuneInUrl;
 
STRING_OUTPUT soCurrentSource, soCurrentSender, soTime, soVolume, soRoomName, soArtworkUrl, soComposer, soTitle, soArtist, soArtistAndComposer, soAlbum, soDetails, soTransportState, soConfigurationUrl, soConfigurationUrlProxy, soKazooUrl, soKazooTidalUrl, soTuneInUrl;
 
STRING_OUTPUT soLpecTxRoom[ciROOMCOUNT], soVolumeRoom[ciROOMCOUNT], soRoomNameRoom[ciROOMCOUNT], soCurrentSourceRoom[ciROOMCOUNT], soSourceName[ciMAXSOURCES], soChannelName[ciMAXCHANNELS], soTrackName[ciMAXTRACKS, ciMAXTRACKS];
 
STRING_OUTPUT soLpecTxRoom[ciROOMCOUNT], soVolumeRoom[ciROOMCOUNT], soRoomNameRoom[ciROOMCOUNT], soCurrentSourceRoom[ciROOMCOUNT], soSourceName[ciMAXSOURCES], soChannelName[ciMAXCHANNELS], soTrackName[ciMAXTRACKS, ciMAXTRACKS];

Revision as of 13:42, 25 March 2015

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

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 complicated operations (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 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

Location

http://products.linn.co.uk/VersionInfo/Downloads/Releases/LinnCrestronModule_latest.zip

Contents

LinnSimplModule

  • LinnDsModule.ct_system_x: a complete Crestron Studio 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). The rooms will need to have static IP addresses allocated to them and entered in the system setup.

LinnSimplPlusModule

  • LinnSimplPlusModule.usp/ush: the Simpl+ program used for the Linn DS module.
  • ExternalUrlSelector.usp/ush: small helper program for jumping to various Kazoo urls.
  • LinnSimplSharpModule.clz: compiled Simpl# code required by the Simpl+ program.

LinnSimplSharpModule

  • Lpec.cs: handles the bulk of the Lpec processing required for the Linn module.

Release Notes

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

Using Crestron Studio is ideal as the complete example makes everything more straightforward. However, there should be no problem using the Linn module in simpl windows.

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.

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

Connection

TCP/IP Client		Linn Simpl Plus Module		Type
-------------    	----------------------------	------
Connect                 doConnect                       DIGITAL_OUTPUT
TX$			soLpecTxRoom[1]		        STRING_OUTPUT
Connect-F		diConnectedRoom[1]		DIGITAL_INPUT 
status		 	                                N/C
RX$		 	biLpecRxRoom[1]		        BUFFER_INPUT

You should no longer need to worry about the 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:

aiVolume: 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)

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

Digital Inputs

DIGITAL_INPUT diStandbyToggle, diStandbyOn, diStandbyOff, diVolumeInc, diVolumeDec, diMuteToggle, diMuteOn, diMuteOff, diPlay, diPause, diStop, diNext, diPrev, diFwd, diRew, diShuffleToggle, diShuffleOn, diShuffleOff, diRepeatToggle, diRepeatOn, diRepeatOff, diTimeModeToggle, diRefresh; DIGITAL_INPUT diConnectedRoom[ciROOMCOUNT], diListenToRoom[ciROOMCOUNT], diVolumeIncRoom[ciROOMCOUNT], diVolumeDecRoom[ciROOMCOUNT], diMuteToggleRoom[ciROOMCOUNT], diMuteOnRoom[ciROOMCOUNT], diMuteOffRoom[ciROOMCOUNT], diStandbyToggleRoom[ciROOMCOUNT], diStandbyOnRoom[ciROOMCOUNT], diStandbyOffRoom[ciROOMCOUNT], diRoomSwapRoom[ciROOMCOUNT, ciROOMCOUNT];

Analog Inputs

aiVolume aiSource aiChannel aiTrack aiSeconds ANALOG_INPUT aiVolumeRoom[ciROOMCOUNT, ciROOMCOUNT];

Buffer Inputs

BUFFER_INPUT biLpecRxRoom[ciROOMCOUNT, ciROOMCOUNT][ciLPECRXSIZE];

Digital Outputs

DIGITAL_OUTPUT doMute, doStandby, doShuffle, doRepeat, doRadioSourceSelected, doPlaylistSourceSelected, doSongcastSourceSelected, doIsPlayable, doIsSeekable, doIsSkippable, doHasVolume, doHasProxyPreamp, doConnect; DIGITAL_OUTPUT doRoomSelected[ciROOMCOUNT], doRoomAvailableAsSongcastSender[ciRoomCount], doRoomSelectable[ciRoomCount], doMuteRoom[ciROOMCOUNT], doHasVolumeRoom[ciROOMCOUNT], doStandbyRoom[ciROOMCOUNT, ciROOMCOUNT];

Analog Outputs

ANALOG_OUTPUT aoVolume, aoSourceCount, aoSourceIndex, aoSourceIndexDeselect, aoChannelCount, aoChannelIndex, aoChannelIndexDeselect, aoTrackCount, aoTrackIndex, aoTrackIndexDeselect, aoDuration, aoSeconds; ANALOG_OUTPUT aoVolumeRoom[ciROOMCOUNT, ciROOMCOUNT];

String Outputs

STRING_OUTPUT soCurrentSource, soCurrentSender, soTime, soVolume, soRoomName, soArtworkUrl, soComposer, soTitle, soArtist, soArtistAndComposer, soAlbum, soDetails, soTransportState, soConfigurationUrl, soConfigurationUrlProxy, soKazooUrl, soKazooTidalUrl, soTuneInUrl; STRING_OUTPUT soLpecTxRoom[ciROOMCOUNT], soVolumeRoom[ciROOMCOUNT], soRoomNameRoom[ciROOMCOUNT], soCurrentSourceRoom[ciROOMCOUNT], soSourceName[ciMAXSOURCES], soChannelName[ciMAXCHANNELS], soTrackName[ciMAXTRACKS, ciMAXTRACKS];