diff --git a/homeassistant/components/media_player/services.yaml b/homeassistant/components/media_player/services.yaml index fe8280fb2ab..3e5ee57cb2f 100644 --- a/homeassistant/components/media_player/services.yaml +++ b/homeassistant/components/media_player/services.yaml @@ -320,3 +320,17 @@ squeezebox_call_method: parameters: description: Optional array of parameters to be appended to the command. See 'Command Line Interface' official help page from Logitech for details. example: '["loadtracks", "track.titlesearch=highway to hell"]' + +yamaha_enable_output: + description: Enable or disable an output port + + fields: + entity_id: + description: Name(s) of entites to enable/disable port on. + example: 'media_player.yamaha' + port: + description: Name of port to enable/disable. + example: 'hdmi1' + enabled: + description: Boolean indicating if port should be enabled or not. + example: true diff --git a/homeassistant/components/media_player/yamaha.py b/homeassistant/components/media_player/yamaha.py index 10f7adccae0..577988bc58c 100644 --- a/homeassistant/components/media_player/yamaha.py +++ b/homeassistant/components/media_player/yamaha.py @@ -12,10 +12,10 @@ from homeassistant.components.media_player import ( SUPPORT_TURN_OFF, SUPPORT_TURN_ON, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, SUPPORT_SELECT_SOURCE, SUPPORT_PLAY_MEDIA, SUPPORT_PAUSE, SUPPORT_STOP, SUPPORT_NEXT_TRACK, SUPPORT_PREVIOUS_TRACK, SUPPORT_PLAY, - MEDIA_TYPE_MUSIC, + MEDIA_TYPE_MUSIC, MEDIA_PLAYER_SCHEMA, DOMAIN, MediaPlayerDevice, PLATFORM_SCHEMA) from homeassistant.const import (CONF_NAME, CONF_HOST, STATE_OFF, STATE_ON, - STATE_PLAYING, STATE_IDLE) + STATE_PLAYING, STATE_IDLE, ATTR_ENTITY_ID) import homeassistant.helpers.config_validation as cv REQUIREMENTS = ['rxv==0.5.1'] @@ -31,7 +31,7 @@ CONF_ZONE_NAMES = 'zone_names' CONF_ZONE_IGNORE = 'zone_ignore' DEFAULT_NAME = 'Yamaha Receiver' -KNOWN = 'yamaha_known_receivers' +DATA_YAMAHA = 'yamaha_known_receivers' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, @@ -44,15 +44,26 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_ZONE_NAMES, default={}): {cv.string: cv.string}, }) +SERVICE_ENABLE_OUTPUT = 'yamaha_enable_output' + +ATTR_PORT = 'port' +ATTR_ENABLED = 'enabled' + +ENABLE_OUTPUT_SCHEMA = MEDIA_PLAYER_SCHEMA.extend({ + vol.Required(ATTR_PORT): cv.string, + vol.Required(ATTR_ENABLED): cv.boolean +}) + def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Yamaha platform.""" import rxv - # keep track of configured receivers so that we don't end up + # Keep track of configured receivers so that we don't end up # discovering a receiver dynamically that we have static config - # for. - if hass.data.get(KNOWN, None) is None: - hass.data[KNOWN] = set() + # for. Map each device from its unique_id to an instance since + # YamahaDevice is not hashable (thus not possible to add to a set). + if hass.data.get(DATA_YAMAHA) is None: + hass.data[DATA_YAMAHA] = {} name = config.get(CONF_NAME) host = config.get(CONF_HOST) @@ -66,9 +77,6 @@ def setup_platform(hass, config, add_devices, discovery_info=None): model = discovery_info.get('model_name') ctrl_url = discovery_info.get('control_url') desc_url = discovery_info.get('description_url') - if ctrl_url in hass.data[KNOWN]: - _LOGGER.info("%s already manually configured", ctrl_url) - return receivers = rxv.RXV( ctrl_url, model_name=model, friendly_name=name, unit_desc_url=desc_url).zone_controllers() @@ -83,13 +91,40 @@ def setup_platform(hass, config, add_devices, discovery_info=None): ctrl_url = "http://{}:80/YamahaRemoteControl/ctrl".format(host) receivers = rxv.RXV(ctrl_url, name).zone_controllers() + devices = [] for receiver in receivers: - if receiver.zone not in zone_ignore: - hass.data[KNOWN].add(receiver.ctrl_url) - add_devices([ - YamahaDevice(name, receiver, source_ignore, - source_names, zone_names) - ], True) + if receiver.zone in zone_ignore: + continue + + device = YamahaDevice(name, receiver, source_ignore, + source_names, zone_names) + + # Only add device if it's not already added + if device.unique_id not in hass.data[DATA_YAMAHA]: + hass.data[DATA_YAMAHA][device.unique_id] = device + devices.append(device) + else: + _LOGGER.debug('Ignoring duplicate receiver %s', name) + + def service_handler(service): + """Handle for services.""" + entity_ids = service.data.get(ATTR_ENTITY_ID) + + devices = [device for device in hass.data[DATA_YAMAHA].values() + if not entity_ids or device.entity_id in entity_ids] + + for device in devices: + port = service.data[ATTR_PORT] + enabled = service.data[ATTR_ENABLED] + + device.enable_output(port, enabled) + device.schedule_update_ha_state(True) + + hass.services.register( + DOMAIN, SERVICE_ENABLE_OUTPUT, service_handler, + schema=ENABLE_OUTPUT_SCHEMA) + + add_devices(devices) class YamahaDevice(MediaPlayerDevice): @@ -98,7 +133,7 @@ class YamahaDevice(MediaPlayerDevice): def __init__(self, name, receiver, source_ignore, source_names, zone_names): """Initialize the Yamaha Receiver.""" - self._receiver = receiver + self.receiver = receiver self._muted = False self._volume = 0 self._pwstate = STATE_OFF @@ -114,10 +149,15 @@ class YamahaDevice(MediaPlayerDevice): self._name = name self._zone = receiver.zone + @property + def unique_id(self): + """Return an unique ID.""" + return '{0}:{1}'.format(self.receiver.ctrl_url, self._zone) + def update(self): """Get the latest details from the device.""" - self._play_status = self._receiver.play_status() - if self._receiver.on: + self._play_status = self.receiver.play_status() + if self.receiver.on: if self._play_status is None: self._pwstate = STATE_ON elif self._play_status.playing: @@ -127,17 +167,17 @@ class YamahaDevice(MediaPlayerDevice): else: self._pwstate = STATE_OFF - self._muted = self._receiver.mute - self._volume = (self._receiver.volume / 100) + 1 + self._muted = self.receiver.mute + self._volume = (self.receiver.volume / 100) + 1 if self.source_list is None: self.build_source_list() - current_source = self._receiver.input + current_source = self.receiver.input self._current_source = self._source_names.get( current_source, current_source) - self._playback_support = self._receiver.get_playback_support() - self._is_playback_supported = self._receiver.is_playback_supported( + self._playback_support = self.receiver.get_playback_support() + self._is_playback_supported = self.receiver.is_playback_supported( self._current_source) def build_source_list(self): @@ -147,7 +187,7 @@ class YamahaDevice(MediaPlayerDevice): self._source_list = sorted( self._source_names.get(source, source) for source in - self._receiver.inputs() + self.receiver.inputs() if source not in self._source_ignore) @property @@ -203,42 +243,42 @@ class YamahaDevice(MediaPlayerDevice): def turn_off(self): """Turn off media player.""" - self._receiver.on = False + self.receiver.on = False def set_volume_level(self, volume): """Set volume level, range 0..1.""" receiver_vol = 100 - (volume * 100) negative_receiver_vol = -receiver_vol - self._receiver.volume = negative_receiver_vol + self.receiver.volume = negative_receiver_vol def mute_volume(self, mute): """Mute (true) or unmute (false) media player.""" - self._receiver.mute = mute + self.receiver.mute = mute def turn_on(self): """Turn the media player on.""" - self._receiver.on = True - self._volume = (self._receiver.volume / 100) + 1 + self.receiver.on = True + self._volume = (self.receiver.volume / 100) + 1 def media_play(self): """Send play command.""" - self._call_playback_function(self._receiver.play, "play") + self._call_playback_function(self.receiver.play, "play") def media_pause(self): """Send pause command.""" - self._call_playback_function(self._receiver.pause, "pause") + self._call_playback_function(self.receiver.pause, "pause") def media_stop(self): """Send stop command.""" - self._call_playback_function(self._receiver.stop, "stop") + self._call_playback_function(self.receiver.stop, "stop") def media_previous_track(self): """Send previous track command.""" - self._call_playback_function(self._receiver.previous, "previous track") + self._call_playback_function(self.receiver.previous, "previous track") def media_next_track(self): """Send next track command.""" - self._call_playback_function(self._receiver.next, "next track") + self._call_playback_function(self.receiver.next, "next track") def _call_playback_function(self, function, function_text): import rxv @@ -250,7 +290,7 @@ class YamahaDevice(MediaPlayerDevice): def select_source(self, source): """Select input source.""" - self._receiver.input = self._reverse_mapping.get(source, source) + self.receiver.input = self._reverse_mapping.get(source, source) def play_media(self, media_type, media_id, **kwargs): """Play media from an ID. @@ -275,7 +315,11 @@ class YamahaDevice(MediaPlayerDevice): """ if media_type == "NET RADIO": - self._receiver.net_radio(media_id) + self.receiver.net_radio(media_id) + + def enable_output(self, port, enabled): + """Enable or disable an output port..""" + self.receiver.enable_output(port, enabled) @property def media_artist(self): diff --git a/tests/components/media_player/test_yamaha.py b/tests/components/media_player/test_yamaha.py index 176cf7c5bf2..3322f6021e7 100644 --- a/tests/components/media_player/test_yamaha.py +++ b/tests/components/media_player/test_yamaha.py @@ -1,129 +1,81 @@ """The tests for the Yamaha Media player platform.""" import unittest -import xml.etree.ElementTree as ET +from unittest.mock import patch, MagicMock -import rxv - -import homeassistant.components.media_player.yamaha as yamaha - -TEST_CONFIG = { - 'name': "Test Receiver", - 'source_ignore': ['HDMI5'], - 'source_names': {'HDMI1': 'Laserdisc'}, - 'zone_names': {'Main_Zone': "Laser Dome"} -} +from homeassistant.setup import setup_component +import homeassistant.components.media_player as mp +from homeassistant.components.media_player import yamaha +from tests.common import get_test_home_assistant -def sample_content(name): - """Read content into a string from a file.""" - with open('tests/components/media_player/yamaha_samples/%s' % name, - encoding='utf-8') as content: - return content.read() +def _create_zone_mock(name, url): + zone = MagicMock() + zone.ctrl_url = url + zone.zone = name + return zone -def yamaha_player(receiver): - """Create a YamahaDevice from a given receiver, presumably a Mock.""" - zone_controller = receiver.zone_controllers()[0] - player = yamaha.YamahaDevice(receiver=zone_controller, **TEST_CONFIG) - player.build_source_list() - return player +class FakeYamahaDevice(object): + """A fake Yamaha device.""" + + def __init__(self, ctrl_url, name, zones=None): + """Initialize the fake Yamaha device.""" + self.ctrl_url = ctrl_url + self.name = name + self.zones = zones or [] + + def zone_controllers(self): + """Return controllers for all available zones.""" + return self.zones -class FakeYamaha(rxv.rxv.RXV): - """Fake Yamaha receiver. - - This inherits from RXV but overrides methods for testing that - would normally have hit the network. This makes it easier to - ensure that usage of the rxv library by HomeAssistant is as we'd - expect. - """ - - _fake_input = 'HDMI1' - - def _discover_features(self): - """Fake the discovery feature.""" - self._desc_xml = ET.fromstring(sample_content('desc.xml')) - - @property - def input(self): - """A fake input for the receiver.""" - return self._fake_input - - @input.setter - def input(self, input_name): - """Set the input for the fake receiver.""" - assert input_name in self.inputs() - self._fake_input = input_name - - def inputs(self): - """All inputs of the fake receiver.""" - return {'AUDIO1': None, - 'AUDIO2': None, - 'AV1': None, - 'AV2': None, - 'AV3': None, - 'AV4': None, - 'AV5': None, - 'AV6': None, - 'AirPlay': 'AirPlay', - 'HDMI1': None, - 'HDMI2': None, - 'HDMI3': None, - 'HDMI4': None, - 'HDMI5': None, - 'NET RADIO': 'NET_RADIO', - 'Pandora': 'Pandora', - 'Rhapsody': 'Rhapsody', - 'SERVER': 'SERVER', - 'SiriusXM': 'SiriusXM', - 'Spotify': 'Spotify', - 'TUNER': 'Tuner', - 'USB': 'USB', - 'V-AUX': None, - 'iPod (USB)': 'iPod_USB'} - - -# pylint: disable=no-member, invalid-name -class TestYamaha(unittest.TestCase): - """Test the media_player yamaha module.""" +class TestYamahaMediaPlayer(unittest.TestCase): + """Test the Yamaha media player.""" def setUp(self): """Setup things to be run when tests are started.""" - super(TestYamaha, self).setUp() - self.rec = FakeYamaha("http://10.0.0.0:80/YamahaRemoteControl/ctrl") - self.player = yamaha_player(self.rec) + self.hass = get_test_home_assistant() + self.main_zone = _create_zone_mock('Main zone', 'http://main') + self.device = FakeYamahaDevice( + 'http://receiver', 'Receiver', zones=[self.main_zone]) - def test_get_playback_support(self): - """Test the playback.""" - rec = self.rec - support = rec.get_playback_support() - self.assertFalse(support.play) - self.assertFalse(support.pause) - self.assertFalse(support.stop) - self.assertFalse(support.skip_f) - self.assertFalse(support.skip_r) + def tearDown(self): + """Stop everything that was started.""" + self.hass.stop() - rec.input = 'NET RADIO' - support = rec.get_playback_support() - self.assertTrue(support.play) - self.assertFalse(support.pause) - self.assertTrue(support.stop) - self.assertFalse(support.skip_f) - self.assertFalse(support.skip_r) + def enable_output(self, port, enabled): + """Enable ouput on a specific port.""" + data = { + 'entity_id': 'media_player.yamaha_receiver_main_zone', + 'port': port, + 'enabled': enabled + } - def test_configuration_options(self): - """Test configuration options.""" - rec_name = TEST_CONFIG['name'] - src_zone = 'Main_Zone' - src_zone_alt = src_zone.replace('_', ' ') - renamed_zone = TEST_CONFIG['zone_names'][src_zone] - ignored_src = TEST_CONFIG['source_ignore'][0] - renamed_src = 'HDMI1' - new_src = TEST_CONFIG['source_names'][renamed_src] - self.assertFalse(self.player.name == rec_name + ' ' + src_zone) - self.assertFalse(self.player.name == rec_name + ' ' + src_zone_alt) - self.assertTrue(self.player.name == rec_name + ' ' + renamed_zone) + self.hass.services.call(yamaha.DOMAIN, + yamaha.SERVICE_ENABLE_OUTPUT, + data, + True) - self.assertFalse(ignored_src in self.player.source_list) - self.assertFalse(renamed_src in self.player.source_list) - self.assertTrue(new_src in self.player.source_list) + def create_receiver(self, mock_rxv): + """Create a mocked receiver.""" + mock_rxv.return_value = self.device + + config = { + 'media_player': { + 'platform': 'yamaha', + 'host': '127.0.0.1' + } + } + + self.assertTrue(setup_component(self.hass, mp.DOMAIN, config)) + + @patch('rxv.RXV') + def test_enable_output(self, mock_rxv): + """Test enabling and disabling outputs.""" + self.create_receiver(mock_rxv) + + self.enable_output('hdmi1', True) + self.main_zone.enable_output.assert_called_with('hdmi1', True) + + self.enable_output('hdmi2', False) + self.main_zone.enable_output.assert_called_with('hdmi2', False) diff --git a/tests/components/media_player/yamaha_samples/desc.xml b/tests/components/media_player/yamaha_samples/desc.xml deleted file mode 100644 index d403fade5f7..00000000000 --- a/tests/components/media_player/yamaha_samples/desc.xml +++ /dev/null @@ -1,3441 +0,0 @@ - - - Title_1 - - - On - Off - - Param_1 - - On - Off - - - - - - - Param_1 - - Available - Unavailable - - - - - - - Param_1 - - 1,15,UTF-8 - - - - Param_1 - - 1,15,UTF-8 - - - - - - On - Standby - - - On - Off - - Param_1 - - On - Off - - - - - - Disable - Enable - - Param_1 - - Disable - Enable - - - - - System,Misc,Event,Notice - System,Power_Control,Power - System,Misc,Network,Network_Name - System,Misc,Network,Network_Standby - System,Misc,Network,DMC_Control - System,Misc,Event,Notice - System,Misc,Network,Network_Name - System,Misc,Network,Network_Standby - System,Misc,Update,Yamaha_Network_Site,Status - System,Misc,Network,DMC_Control - - - - - - Param_1 - - 1,9,Latin-1 - - - - Name,Zone=Param_1 - - 1,9,Latin-1 - - - - - - - Param_1 - - - - - - Input,Input_Sel=Param_1 - - - - - - - - Param_1 - - - - - - Input,Input_Sel=Param_1 - - - - - - - - - - Val=Param_1:Exp=Param_2:Unit=Param_3 - - -805,165,5 - - - 1 - - - dB - - - - Volume,Lvl,Val=Param_1:Volume,Lvl,Exp=Param_2:Volume,Lvl,Unit=Param_3 - - -805,165,5 - - - 1 - - - dB - - - - - On - Off - - Volume,Mute=Param_1 - - On - Off - - - - - - - On - Standby - - Power_Control,Power=Param_1 - - On - Standby - - - - - Last - 120 min - 90 min - 60 min - 30 min - Off - - Power_Control,Sleep=Param_1 - - 120 min - 90 min - 60 min - 30 min - Off - - - - - - - Play - Pause - Stop - - - Skip Fwd - Skip Rev - - - - - Up - Down - Left - Right - Return - Sel - Return to Home - On Screen - Top Menu - Menu - Option - Display - - - - - - - Param_1 - - Hall in Munich - Hall in Vienna - Chamber - Cellar Club - The Roxy Theatre - The Bottom Line - Sports - Action Game - Roleplaying Game - Music Video - Standard - Spectacle - Sci-Fi - Adventure - Drama - Mono Movie - Surround Decoder - 2ch Stereo - 7ch Stereo - - - - Surround,Program_Sel,Current,Sound_Program=Param_1 - - Hall in Munich - Hall in Vienna - Chamber - Cellar Club - The Roxy Theatre - The Bottom Line - Sports - Action Game - Roleplaying Game - Music Video - Standard - Spectacle - Sci-Fi - Adventure - Drama - Mono Movie - Surround Decoder - 2ch Stereo - 7ch Stereo - - - - - On - Off - - Surround,Program_Sel,Current,Straight=Param_1 - - On - Off - - - - - On - Off - - Surround,Program_Sel,Current,Enhancer=Param_1 - - On - Off - - - - - - - - Val=Param_1:Exp=Param_2:Unit=Param_3 - - -60,60,5 - - - 1 - - - dB - - - - Sound_Video,Tone,Bass,Val=Param_1:Sound_Video,Tone,Bass,Exp=Param_2:Sound_Video,Tone,Bass,Unit=Param_3 - - -60,60,5 - - - 1 - - - dB - - - - - - Val=Param_1:Exp=Param_2:Unit=Param_3 - - -60,60,5 - - - 1 - - - dB - - - - Sound_Video,Tone,Treble,Val=Param_1:Sound_Video,Tone,Treble,Exp=Param_2:Sound_Video,Tone,Treble,Unit=Param_3 - - -60,60,5 - - - 1 - - - dB - - - - - - - Val=Param_1:Exp=Param_2:Unit=Param_3 - - -60,60,5 - - - 1 - - - dB - - - - Volume,Subwoofer_Trim,Val=Param_1:Volume,Subwoofer_Trim,Exp=Param_2:Volume,Subwoofer_Trim,Unit=Param_3 - - -60,60,5 - - - 1 - - - dB - - - - - Auto - Off - - Sound_Video,Adaptive_DRC=Param_1 - - Auto - Off - - - - - Auto - Off - - Surround,_3D_Cinema_DSP=Param_1 - - Auto - Off - - - - - - Param_1 - - 0,5,1 - - - - Sound_Video,Dialogue_Adjust,Dialogue_Lift=Param_1 - - 0,5,1 - - - - - - Param_1 - - 0,3,1 - - - - Sound_Video,Dialogue_Adjust,Dialogue_Lvl=Param_1 - - 0,3,1 - - - - - On - Off - - Sound_Video,Pure_Direct,Mode=Param_1 - - On - Off - - - - - - Sound_Video,HDMI,Standby_Through_Info=Param_1 - - On - Off - - - - - - Main_Zone,Power_Control,Power - Main_Zone,Volume,Lvl - Main_Zone,Volume,Mute - Main_Zone,Input,Input_Sel - Main_Zone,Config,Name,Zone - Main_Zone,Scene,Scene_Sel - Main_Zone,Sound_Video,Tone,Bass - Main_Zone,Sound_Video,Tone,Treble - Main_Zone,Surround,Program_Sel,Current,Sound_Program - Main_Zone,Surround,Program_Sel,Current,Straight - Main_Zone,Surround,Program_Sel,Current,Enhancer - Main_Zone,Sound_Video,Adaptive_DRC - Main_Zone,Surround,_3D_Cinema_DSP - Main_Zone,Sound_Video,Dialogue_Adjust,Dialogue_Lift - System,Sound_Video,HDMI,Video,Preset_Sel,Current - Main_Zone,Sound_Video,Pure_Direct,Mode - Main_Zone,Cursor_Control,Cursor - Main_Zone,Cursor_Control,Menu_Control - Main_Zone,Surround,Enhancer_Type - Main_Zone,Sound_Video,Dialogue_Adjust,Dialogue_Lvl - Main_Zone,Volume,Subwoofer_Trim - Main_Zone,Power_Control,Sleep - Main_Zone,Play_Control,Playback - Main_Zone,Basic_Status - Main_Zone,Input,Input_Sel_Item - Main_Zone,Config - Main_Zone,Scene,Scene_Sel_Item - - - - - - Param_1 - - 1,9,Latin-1 - - - - Name,Zone=Param_1 - - 1,9,Latin-1 - - - - - - Param_1 - - - - - - Input,Input_Sel=Param_1 - - - - - - - - - Val=Param_1:Exp=Param_2:Unit=Param_3 - - -805,165,5 - - - 1 - - - dB - - - - Volume,Lvl,Val=Param_1:Volume,Lvl,Exp=Param_2:Volume,Lvl,Unit=Param_3 - - -805,165,5 - - - 1 - - - dB - - - - - On - Off - - Volume,Mute=Param_1 - - On - Off - - - - - - Volume,Output_Info=Param_1 - - Fixed - Variable - - - - - - - On - Standby - - Power_Control,Power=Param_1 - - On - Standby - - - - - Last - 120 min - 90 min - 60 min - 30 min - Off - - Power_Control,Sleep=Param_1 - - 120 min - 90 min - 60 min - 30 min - Off - - - - - - - Play - Pause - Stop - - - Skip Fwd - Skip Rev - - - - Zone_2,Power_Control,Power - Zone_2,Volume,Lvl - Zone_2,Volume,Mute - Zone_2,Input,Input_Sel - Zone_2,Config,Name,Zone - Zone_2,Scene,Scene_Sel - Zone_2,Sound_Video,Tone,Bass - Zone_2,Sound_Video,Tone,Treble - Zone_2,Cursor_Control,Cursor - Zone_2,Cursor_Control,Menu_Control - Zone_2,Volume,Output - Zone_2,Power_Control,Sleep - Zone_2,Play_Control,Playback - Zone_2,Basic_Status - Zone_2,Input,Input_Sel_Item - Zone_2,Config - Zone_2,Scene,Scene_Sel_Item - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - - Auto Up - Auto Down - Cancel - - Tuning,Freq,AM,Val=Param_1:Tuning,Freq,AM,Exp=Param_2:Tuning,Freq,AM,Unit=Param_3 - - 530,1710,10 - Auto Up - Auto Down - - - 0 - - - - - kHz - - - - - - - Auto Up - Auto Down - Cancel - - Tuning,Freq,FM,Val=Param_1:Tuning,Freq,FM,Exp=Param_2:Tuning,Freq,FM,Unit=Param_3 - - 8750,10790,20 - Auto Up - Auto Down - - - 2 - - - - - MHz - - - - - - - Up - Down - - Preset,Preset_Sel=Param_1 - - - - - - - - AM - FM - - Tuning,Band=Param_1 - - AM - FM - - - - - - - Val=Param_1:Exp=Param_2:Unit=Param_3 - - 530,1710,10 - - - 0 - - - kHz - - - - Tuning,Freq,AM,Val=Param_1:Tuning,Freq,AM,Exp=Param_2:Tuning,Freq,AM,Unit=Param_3 - - 530,1710,10 - Auto Up - Auto Down - - - 0 - - - - - kHz - - - - - - - - Val=Param_1:Exp=Param_2:Unit=Param_3 - - 8750,10790,20 - - - 2 - - - MHz - - - - Tuning,Freq,FM,Val=Param_1:Tuning,Freq,FM,Exp=Param_2:Tuning,Freq,FM,Unit=Param_3 - - 8750,10790,20 - Auto Up - Auto Down - - - 2 - - - - - MHz - - - - - - - - - Param_1 - - - - - - Preset,Preset_Sel=Param_1 - - - - - - - - - - Tuning,Band=Param_1 - - AM - FM - - - - - - Tuning,Freq,Current,Val=Param_1:Tuning,Freq,Current,Exp=Param_2:Tuning,Freq,Current,Unit=Param_3 - - 530,1710,10 - 8750,10790,20 - Auto Up - Auto Down - - - 0 - 2 - - - - - kHz - MHz - - - - - - - - - Signal_Info,Tuned=Param_1 - - Negate - Assert - - - - - - Signal_Info,Stereo=Param_1 - - Negate - Assert - - - - - - - Tuner,Play_Control,Search_Mode - Tuner,Play_Control,Preset,Preset_Sel - Tuner,Play_Control,Tuning,Band - Tuner,Play_Control,Tuning,Freq,FM - Tuner,Play_Control,Tuning,Freq,AM - Tuner,Play_Control,Tuning,Freq,FM,Val - Tuner,Play_Control,Tuning,Freq,AM,Val - Tuner,Play_Info - Tuner,Config - Tuner,Play_Control,Preset,Preset_Sel_Item - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Play - Pause - - Playback_Info=Param_1 - - Play - Stop - - - - - Skip Fwd - Skip Rev - - - - - - Meta_Info,Artist=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Song=Param_1 - - 0,128,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Stop - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - Input_Logo,URL_S=Param_1 - - 0,128,UTF-8 - - - - - - AirPlay,Play_Control,Playback - AirPlay,Play_Info - AirPlay,Config - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Play - Pause - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - Skip Fwd - Skip Rev - - - - - - Meta_Info,Artist=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Track=Param_1 - - 0,128,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - - Input_Logo,URL_S=Param_1 - - 0,128,UTF-8 - - - - - - Spotify,Play_Control,Playback - Spotify,Play_Control,Play_Mode,Repeat - Spotify,Play_Control,Play_Mode,Shuffle - Spotify,Play_Info - Spotify,Config - - - - - Extended - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Off - One - All - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - Off - Songs - Albums - - Play_Mode,Shuffle=Param_1 - - Off - Songs - Albums - - - - - Play - Pause - Stop - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - Skip Fwd - Skip Rev - - - - - - Meta_Info,Artist=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Song=Param_1 - - 0,128,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - - Play_Mode,Shuffle=Param_1 - - Off - Songs - Albums - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - - - - Param_1 - - 1,8,1,Line_% - - - - - Up - Down - Return - Sel - Return to Home - - - - Param_1 - - 1,65536,1 - - - - - Up - Down - - - - - - Menu_Status=Param_1 - - Ready - Busy - - - - - - Menu_Layer=Param_1 - - 1,16,1 - - - - - - Menu_Name=Param_1 - - 0,128,UTF-8 - - - - - - Line_1 - - Current_List,Line_1,Txt=Param_1:Current_List,Line_1,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_2 - - Current_List,Line_2,Txt=Param_1:Current_List,Line_2,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_3 - - Current_List,Line_3,Txt=Param_1:Current_List,Line_3,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_4 - - Current_List,Line_4,Txt=Param_1:Current_List,Line_4,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_5 - - Current_List,Line_5,Txt=Param_1:Current_List,Line_5,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_6 - - Current_List,Line_6,Txt=Param_1:Current_List,Line_6,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_7 - - Current_List,Line_7,Txt=Param_1:Current_List,Line_7,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_8 - - Current_List,Line_8,Txt=Param_1:Current_List,Line_8,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - - - Cursor_Position,Current_Line=Param_1 - - 1,65536,1 - - - - - - Cursor_Position,Max_Line=Param_1 - - 0,65536,1 - - - - - - - iPod_USB,Play_Control,Playback - iPod_USB,List_Control,Direct_Sel - iPod_USB,List_Control,Jump_Line - iPod_USB,List_Control,Cursor - iPod_USB,List_Control,Page - iPod_USB,Play_Control,Play_Mode,Repeat - iPod_USB,Play_Control,Play_Mode,Shuffle - iPod_USB,Play_Control,iPod_Mode - iPod_USB,Play_Info - iPod_USB,List_Info - iPod_USB,Config - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Off - One - All - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - Off - On - - Play_Mode,Shuffle=Param_1 - - Off - On - - - - - Play - Pause - Stop - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - Skip Fwd - Skip Rev - - - - - - Meta_Info,Artist=Param_1 - - 0,64,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,64,UTF-8 - - - - - - Meta_Info,Song=Param_1 - - 0,64,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - - Play_Mode,Shuffle=Param_1 - - Off - On - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - - - - Param_1 - - 1,8,1,Line_% - - - - - Up - Down - Return - Sel - Return to Home - - - - Param_1 - - 1,65536,1 - - - - - Up - Down - - - - - - Menu_Status=Param_1 - - Ready - Busy - - - - - - Menu_Layer=Param_1 - - 1,16,1 - - - - - - Menu_Name=Param_1 - - 0,128,UTF-8 - - - - - - Line_1 - - Current_List,Line_1,Txt=Param_1:Current_List,Line_1,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_2 - - Current_List,Line_2,Txt=Param_1:Current_List,Line_2,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_3 - - Current_List,Line_3,Txt=Param_1:Current_List,Line_3,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_4 - - Current_List,Line_4,Txt=Param_1:Current_List,Line_4,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_5 - - Current_List,Line_5,Txt=Param_1:Current_List,Line_5,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_6 - - Current_List,Line_6,Txt=Param_1:Current_List,Line_6,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_7 - - Current_List,Line_7,Txt=Param_1:Current_List,Line_7,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_8 - - Current_List,Line_8,Txt=Param_1:Current_List,Line_8,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - - - Cursor_Position,Current_Line=Param_1 - - 1,65536,1 - - - - - - Cursor_Position,Max_Line=Param_1 - - 0,65536,1 - - - - - - - USB,Play_Control,Play_Mode,Repeat - USB,Play_Control,Play_Mode,Shuffle - USB,Play_Control,Playback - USB,Play_Control,Preset,Preset_Sel - USB,List_Control,Direct_Sel - USB,List_Control,Jump_Line - USB,List_Control,Cursor - USB,List_Control,Page - USB,Play_Info - USB,List_Info - USB,Config - USB,Play_Control,Preset,Preset_Sel_Item - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Play - Stop - - Playback_Info=Param_1 - - Play - Stop - - - - - - - - Meta_Info,Station=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Song=Param_1 - - 0,128,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Stop - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - - - - Param_1 - - 1,8,1,Line_% - - - - - Up - Down - Return - Sel - Return to Home - - - - Param_1 - - 1,65536,1 - - - - - Up - Down - - - - - - Menu_Status=Param_1 - - Ready - Busy - - - - - - Menu_Layer=Param_1 - - 1,16,1 - - - - - - Menu_Name=Param_1 - - 0,128,UTF-8 - - - - - - Line_1 - - Current_List,Line_1,Txt=Param_1:Current_List,Line_1,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_2 - - Current_List,Line_2,Txt=Param_1:Current_List,Line_2,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_3 - - Current_List,Line_3,Txt=Param_1:Current_List,Line_3,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_4 - - Current_List,Line_4,Txt=Param_1:Current_List,Line_4,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_5 - - Current_List,Line_5,Txt=Param_1:Current_List,Line_5,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_6 - - Current_List,Line_6,Txt=Param_1:Current_List,Line_6,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_7 - - Current_List,Line_7,Txt=Param_1:Current_List,Line_7,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_8 - - Current_List,Line_8,Txt=Param_1:Current_List,Line_8,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - - - Cursor_Position,Current_Line=Param_1 - - 1,65536,1 - - - - - - Cursor_Position,Max_Line=Param_1 - - 0,65536,1 - - - - - - - NET_RADIO,Play_Control,Playback - NET_RADIO,List_Control,Direct_Sel - NET_RADIO,List_Control,Jump_Line - NET_RADIO,List_Control,Cursor - NET_RADIO,List_Control,Page - NET_RADIO,Play_Control,Preset,Preset_Sel - NET_RADIO,List_Control,Bookmark - NET_RADIO,Play_Info - NET_RADIO,List_Info - NET_RADIO,Config - NET_RADIO,Play_Control,Preset,Preset_Sel_Item - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Off - One - All - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - Off - On - - Play_Mode,Shuffle=Param_1 - - Off - On - - - - - Play - Pause - Stop - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - Skip Fwd - Skip Rev - - - - - - Meta_Info,Artist=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Song=Param_1 - - 0,128,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - - Play_Mode,Shuffle=Param_1 - - Off - On - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - - - - Param_1 - - 1,8,1,Line_% - - - - - Up - Down - Return - Sel - Return to Home - - - - Param_1 - - 1,65536,1 - - - - - Up - Down - - - - - - Menu_Status=Param_1 - - Ready - Busy - - - - - - Menu_Layer=Param_1 - - 1,16,1 - - - - - - Menu_Name=Param_1 - - 0,128,UTF-8 - - - - - - Line_1 - - Current_List,Line_1,Txt=Param_1:Current_List,Line_1,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_2 - - Current_List,Line_2,Txt=Param_1:Current_List,Line_2,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_3 - - Current_List,Line_3,Txt=Param_1:Current_List,Line_3,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_4 - - Current_List,Line_4,Txt=Param_1:Current_List,Line_4,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_5 - - Current_List,Line_5,Txt=Param_1:Current_List,Line_5,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_6 - - Current_List,Line_6,Txt=Param_1:Current_List,Line_6,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_7 - - Current_List,Line_7,Txt=Param_1:Current_List,Line_7,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_8 - - Current_List,Line_8,Txt=Param_1:Current_List,Line_8,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - - - Cursor_Position,Current_Line=Param_1 - - 1,65536,1 - - - - - - Cursor_Position,Max_Line=Param_1 - - 0,65536,1 - - - - - - - SERVER,Play_Control,Play_Mode,Repeat - SERVER,Play_Control,Play_Mode,Shuffle - SERVER,Play_Control,Playback - SERVER,Play_Control,Preset,Preset_Sel - SERVER,List_Control,Direct_Sel - SERVER,List_Control,Jump_Line - SERVER,List_Control,Cursor - SERVER,List_Control,Page - SERVER,Play_Control,Play_URI - SERVER,Play_Info - SERVER,List_Info - SERVER,Config - SERVER,Play_Control,Preset,Preset_Sel_Item - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Off - One - All - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - Off - On - - Play_Mode,Shuffle=Param_1 - - Off - On - - - - - Play - Pause - Stop - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - Skip Fwd - Skip Rev - - - - - - Meta_Info,Artist=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Song=Param_1 - - 0,128,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - - Play_Mode,Repeat=Param_1 - - Off - One - All - - - - - - Play_Mode,Shuffle=Param_1 - - Off - On - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - Input_Logo,URL_S=Param_1 - - 0,128,UTF-8 - - - - - - - - - Param_1 - - 1,8,1,Line_% - - - - - - Line=Param_1:Keyword=Param_2 - - 1,8,1,Line_% - - - 0,30,Ascii - - - - - Up - Down - Return - Sel - Return to Home - - - - Param_1 - - 1,65536,1 - - - - - Up - Down - - - - - - Menu_Status=Param_1 - - Ready - Busy - - - - - - Menu_Layer=Param_1 - - 1,16,1 - - - - - - Menu_Name=Param_1 - - 0,128,UTF-8 - - - - - - Line_1 - - Current_List,Line_1,Txt=Param_1:Current_List,Line_1,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - Line_2 - - Current_List,Line_2,Txt=Param_1:Current_List,Line_2,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - Line_3 - - Current_List,Line_3,Txt=Param_1:Current_List,Line_3,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - Line_4 - - Current_List,Line_4,Txt=Param_1:Current_List,Line_4,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - Line_5 - - Current_List,Line_5,Txt=Param_1:Current_List,Line_5,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - Line_6 - - Current_List,Line_6,Txt=Param_1:Current_List,Line_6,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - Line_7 - - Current_List,Line_7,Txt=Param_1:Current_List,Line_7,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - Line_8 - - Current_List,Line_8,Txt=Param_1:Current_List,Line_8,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - Keyword - - - - - - - Cursor_Position,Current_Line=Param_1 - - 1,65536,1 - - - - - - Cursor_Position,Max_Line=Param_1 - - 0,65536,1 - - - - - - - Rhapsody,Play_Control,Play_Mode,Repeat - Rhapsody,Play_Control,Play_Mode,Shuffle - Rhapsody,Play_Control,Playback - Rhapsody,Play_Control,Preset,Preset_Sel - Rhapsody,List_Control,Direct_Sel - Rhapsody,List_Control,Jump_Line - Rhapsody,List_Control,Cursor - Rhapsody,List_Control,Page - Rhapsody,List_Control,Direct_Sel_with_Keyword - Rhapsody,Play_Info - Rhapsody,List_Info - Rhapsody,Config - Rhapsody,Play_Control,Preset,Preset_Sel_Item - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Play - Stop - - Playback_Info=Param_1 - - Play - Stop - - - - - - - - Meta_Info,Ch_Name=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Artist=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Song=Param_1 - - 0,128,UTF-8 - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Stop - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - Input_Logo,URL_S=Param_1 - - 0,128,UTF-8 - - - - - - - - - Param_1 - - 1,8,1,Line_% - - - - - Up - Down - Return - Sel - Return to Home - - - - Param_1 - - 1,65536,1 - - - - - Up - Down - - - - - - Menu_Status=Param_1 - - Ready - Busy - - - - - - Menu_Layer=Param_1 - - 1,16,1 - - - - - - Menu_Name=Param_1 - - 0,128,UTF-8 - - - - - - Line_1 - - Current_List,Line_1,Txt=Param_1:Current_List,Line_1,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_2 - - Current_List,Line_2,Txt=Param_1:Current_List,Line_2,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_3 - - Current_List,Line_3,Txt=Param_1:Current_List,Line_3,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_4 - - Current_List,Line_4,Txt=Param_1:Current_List,Line_4,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_5 - - Current_List,Line_5,Txt=Param_1:Current_List,Line_5,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_6 - - Current_List,Line_6,Txt=Param_1:Current_List,Line_6,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_7 - - Current_List,Line_7,Txt=Param_1:Current_List,Line_7,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_8 - - Current_List,Line_8,Txt=Param_1:Current_List,Line_8,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - - - Cursor_Position,Current_Line=Param_1 - - 1,65536,1 - - - - - - Cursor_Position,Max_Line=Param_1 - - 0,65536,1 - - - - - - - SiriusXM,Play_Control,Playback - SiriusXM,Play_Control,Preset,Preset_Sel - SiriusXM,List_Control,Direct_Sel - SiriusXM,List_Control,Jump_Line - SiriusXM,List_Control,Cursor - SiriusXM,List_Control,Page - SiriusXM,Play_Info - SiriusXM,List_Info - SiriusXM,Config - SiriusXM,Play_Control,Preset,Preset_Sel_Item - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Play - Pause - Stop - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - Skip Fwd - - - Thumb Up - Thumb Down - - Feedback=Param_1 - - --- - Thumb Up - Thumb Down - - - - - - - - Meta_Info,Station=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Album=Param_1 - - 0,128,UTF-8 - - - - - - Meta_Info,Track=Param_1 - - 0,128,UTF-8 - - - - - - Feedback=Param_1 - - --- - Thumb Up - Thumb Down - - - - - - Feature_Availability=Param_1 - - Ready - Not Ready - - - - - - Playback_Info=Param_1 - - Play - Pause - Stop - - - - - - Album_ART,URL=Param_1 - - 0,128,UTF-8 - - - - - - Album_ART,ID=Param_1 - - 0,255,1 - - - - - - Album_ART,Format=Param_1 - - BMP - YMF - - - - - - Input_Logo,URL_S=Param_1 - - 0,128,UTF-8 - - - - - - - - - Param_1 - - 1,8,1,Line_% - - - - - Up - Down - Return - Sel - Return to Home - - - - Param_1 - - 1,65536,1 - - - - - Up - Down - - - - - - Menu_Status=Param_1 - - Ready - Busy - - - - - - Menu_Layer=Param_1 - - 1,16,1 - - - - - - Menu_Name=Param_1 - - 0,128,UTF-8 - - - - - - Line_1 - - Current_List,Line_1,Txt=Param_1:Current_List,Line_1,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_2 - - Current_List,Line_2,Txt=Param_1:Current_List,Line_2,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_3 - - Current_List,Line_3,Txt=Param_1:Current_List,Line_3,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_4 - - Current_List,Line_4,Txt=Param_1:Current_List,Line_4,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_5 - - Current_List,Line_5,Txt=Param_1:Current_List,Line_5,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_6 - - Current_List,Line_6,Txt=Param_1:Current_List,Line_6,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_7 - - Current_List,Line_7,Txt=Param_1:Current_List,Line_7,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - Line_8 - - Current_List,Line_8,Txt=Param_1:Current_List,Line_8,Attribute=Param_2 - - 0,128,UTF-8 - - - Container - Unplayable Item - Item - Unselectable - - - - - - - Cursor_Position,Current_Line=Param_1 - - 1,65536,1 - - - - - - Cursor_Position,Max_Line=Param_1 - - 0,65536,1 - - - - - - - Pandora,Play_Control,Feedback - Pandora,Play_Control,Playback - Pandora,Play_Control,Preset,Preset_Sel - Pandora,List_Control,Direct_Sel - Pandora,List_Control,Jump_Line - Pandora,List_Control,Cursor - Pandora,List_Control,Page - Pandora,Play_Info - Pandora,List_Info - Pandora,Config - Pandora,Play_Control,Preset,Preset_Sel_Item - - -