home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 October / PCWorld_2002-10_cd.bin / Software / TemaCD / wmp9xpbeta / mpsetupXP.exe / wmploc.DLL / 256 / 1500 < prev    next >
Encoding:
Text File  |  2002-08-19  |  44.8 KB  |  626 lines

  1.  ■//<script>
  2. var g_kDefaultViewHeight=80;
  3. var g_kDefaultViewWidth=250;
  4. // Define a set of constants to represent the current transport state
  5. var g_kTransportStateUnknown = 0;
  6. var g_kTransportStateStopped = 1;
  7. var g_kTransportStatePaused = 2;
  8. var g_kTransportStatePlaying = 3;
  9. var g_kTransportStateSeeking = 4;
  10. var g_kTransportStateScanning = 5;
  11. // Define our global variables
  12. var g_pAVTransportService = null;       // Current remote device's AVTransport service
  13. var g_pVolumeService = null;            // Current remote device's Volume service
  14. var g_pMuteService = null;              // Current remote device's mute service
  15. var g_pConnectorService = null;         // Current remote device's Connector service
  16. var g_iNumberTracks = 0;                // number of tracks in current media being played
  17. var g_iMaxCount = 0;                    // maximum position we can seek to on current track
  18. var g_iLastKnownVolume = 0;             // Player's last known volume state before we muted it
  19. var g_pCurrentDevice = null;            // Currently selected device
  20. var g_iCurrentTransportState = g_kTransportStateUnknown;
  21. var g_fSettingVolume = false;           // Are we currently telling the remote device to change the volume?
  22. var g_fSettingSeek = false;             // Prevent re-entrancy from setting seek bar, processing seek event, ...
  23. var g_fSettingShuffle = false;          // Prevent re-entrancy from during setting of shuffle
  24. var g_fSettingRepeat = false;           // Prevent re-entrancy from during setting of repeat
  25. //**********************************************************************
  26. function DisplayAVTransportError(iErrorCode)
  27. {
  28.     metadata.foregroundColor = "#FF0000";
  29.     switch (iErrorCode)
  30.     {
  31.     case 700:
  32.         metadata.value = "Error: Transition not available";
  33.         break;
  34.     case 701:
  35.         metadata.value = "Error: No contents";
  36.         break;
  37.     case 702:
  38.         metadata.value = "Error: Read error";
  39.         break;
  40.     case 703:
  41.         metadata.value = "Error: Format not supported for playback";
  42.         break;
  43.     case 704:
  44.         metadata.value = "Error: Transport is locked";
  45.         break;
  46.     case 709:
  47.         metadata.value = "Error: Seek unit not supported";
  48.         break;
  49.     case 710:
  50.         metadata.value = "Error: Illegal seek target";
  51.         break;
  52.     case 711:
  53.         metadata.value = "Error: Play mode not supported";
  54.         break;
  55.     default:
  56.         metadata.foregroundColor = "#00FF00";
  57.         break;
  58.     }
  59. }
  60. //**********************************************************************
  61. function OnMuteChange(pService, strNewState)
  62. {
  63.     if (pService == g_pMuteService)
  64.     {
  65.         mute.down = (strNewState == "True") ? true : false;
  66.     }
  67. }
  68. //**********************************************************************
  69. function OnVolumeChange(pService, fltNewVolume)
  70. {
  71.     if (pService == g_pVolumeService)
  72.     {
  73.         if ( ! g_fSettingVolume)
  74.         {
  75.             volume.value = fltNewVolume;
  76.         }
  77.     }
  78. }
  79. //**********************************************************************
  80. function OnDeviceSwitch(pDevice)
  81. {
  82.     SelectDevice(pDevice);
  83. }
  84. //**********************************************************************
  85. function OnTrackMaxCountChange(pService, iMaxCount)
  86. {
  87.     if (pService == g_pAVTransportService)
  88.     {
  89.         g_iMaxCount = iMaxCount;
  90.     }
  91. }
  92. //**********************************************************************
  93. function OnPlayModeChange(pService, strNewPlayMode)
  94. {
  95.     if (pService == g_pAVTransportService)
  96.     {
  97.         if (strNewPlayMode == "REPEAT_ALL")
  98.         {
  99.                 repeat.down = true;
  100.                 shuffle.down = false;
  101.         }
  102.         else if (strNewPlayMode == "SHUFFLE")
  103.         {
  104.                 repeat.down = false;
  105.                 shuffle.down = true;
  106.         }
  107.         else
  108.         {
  109.                 repeat.down = false;
  110.                 shuffle.down = false;
  111.         }
  112.     }
  113. }
  114. //**********************************************************************
  115. function OnNumberOfTracksChange(pService, strCurrentTrack)
  116. {
  117.     if (pService == g_pAVTransportService)
  118.     {
  119.         g_iNumberTracks = parseInt(strCurrentTrack);
  120.     }
  121. }
  122. //**********************************************************************
  123. function OnTransportStateChange(pService, strNewTransportState)
  124. {
  125.     metadata.foregroundColor = "#00FF00";
  126.     if (pService == g_pAVTransportService)
  127.     {
  128.         if (strNewTransportState == "PLAYING")
  129.         {
  130.             g_iCurrentTransportState = g_kTransportStatePlaying;
  131.             metadata.value = "Playing...";
  132.         }
  133.         else if (strNewTransportState == "PAUSED_PLAYBACK")
  134.         {
  135.             g_iCurrentTransportState = g_kTransportStatePaused;
  136.             metadata.value = "Paused...";
  137.         }
  138.         else
  139.         {
  140.             metadata.value = "";
  141.             if (strNewTransportState == "STOPPED")
  142.             {
  143.                 g_iCurrentTransportState = g_kTransportStateStopped;
  144.                 metadata.value = "Stopped";
  145.             }
  146.             else if (strNewTransportState == "SEEKING")
  147.             {
  148.                 g_iCurrentTransportState = g_kTransportStateSeeking;
  149.             }
  150.             else if (strNewTransportState == "SCANNING")
  151.             {
  152.                 g_iCurrentTransportState = g_kTransportStateScanning;
  153.             }
  154.             else
  155.             {
  156.                 g_iCurrentTransportState = g_kTransportStateUnknown;
  157.             }
  158.         }
  159.         SyncUIWithDevice();
  160.     }
  161. }
  162. //**********************************************************************
  163. function OnRelativeTimePositionChange(pService, strNewTime)
  164. {
  165.     if (pService == g_pAVTransportService)
  166.     {
  167.         tracktime.value = strNewTime.substring(0, strNewTime.lastIndexOf("."));
  168.     }
  169. }
  170. //**********************************************************************
  171. function OnRelativeCounterPositionChange(pService, iNewPosition)
  172. {
  173.     if (pService == g_pAVTransportService)
  174.     {
  175.         if ( ! g_fSettingSeek && g_iMaxCount != 0)
  176.         {
  177.             g_fSettingSeek = true;
  178.             seek.value = (iNewPosition * 100) / g_iMaxCount;
  179.             g_fSettingSeek = false;
  180.         }
  181.     }
  182. }
  183. //**********************************************************************
  184. // Abstract: SyncUIWithDevice() will make sure that the device is in sync
  185. //           with the current state of the default device.
  186. //**********************************************************************
  187. function SyncUIWithDevice()
  188. {
  189.     if (g_pCurrentDevice != null)
  190.     {
  191.         // Make sure our "combobox" displays the name of the current device
  192.         SelectedDeviceLabel.value = g_pCurrentDevice.FriendlyName();
  193.     }
  194.     else
  195.     {
  196.         SelectedDeviceLabel.value = "";
  197.     }
  198.     play.enabled = true;
  199.     pause.enabled = true;
  200.     stop.enabled = true;
  201.     bgSeekCtls.enabled = true;
  202.     seek.enabled = true;
  203.     rew.enabled = true;
  204.     ffwd.enabled = true;
  205.     mute.enabled = true;
  206.     volume.enabled = true;
  207.     play.visible = true;
  208.     pause.visible = false;
  209.     shuffle.enabled = true;
  210.     repeat.enabled = true;
  211.     switch (g_iCurrentTransportState)
  212.     {
  213.     case g_kTransportStateUnknown:
  214.         play.enabled = false;
  215.         pause.enabled = false;
  216.         stop.enabled = false;
  217.         bgSeekCtls.enabled = false;
  218.         seek.enabled = false;
  219.         rew.enabled = false;
  220.         ffwd.enabled = false;
  221.         mute.enabled = false;
  222.         volume.enabled = false;
  223.         shuffle.enabled = false;
  224.         repeat.enabled = false;
  225.         break;
  226.     case g_kTransportStateStopped:
  227.         play.visible = true;
  228.         pause.visible = false;
  229.         stop.enabled = false;
  230.         rew.enabled = false;
  231.         ffwd.enabled = false;
  232.         tracktime.value = "00:00";
  233.         break;
  234.     case g_kTransportStatePaused:
  235.         play.visible = true;
  236.         pause.visible = false;
  237.         rew.enabled = false;
  238.         ffwd.enabled = false;
  239.         break;
  240.     case g_kTransportStatePlaying:
  241.         play.visible = false;
  242.         pause.visible = true;
  243.         break;
  244.     case g_kTransportStateSeeking:
  245.         pause.enabled = false;
  246.         break;
  247.     case g_kTransportStateScanning:
  248.         play.enabled = false;
  249.         pause.enabled = false;
  250.         stop.enabled = false;
  251.         bgSeekCtls.enabled = false;
  252.         seek.enabled = false;
  253.         rew.enabled = false;
  254.         ffwd.enabled = false;
  255.         break;
  256.     }
  257. }
  258. //**********************************************************************
  259. function SelectDevice(pDevice)
  260. {
  261.     // If we had a previous device and register events for it, then unregister them now.
  262.     if (g_pAVTransportService != null)
  263.     {
  264.         g_pAVTransportService.UnregisterEvent("TransportState");
  265.         g_pAVTransportService.UnregisterEvent("RelativeTimePosition");
  266.         g_pAVTransportService.UnregisterEvent("RelativeCounterPosition");
  267.         g_pAVTransportService.UnregisterEvent("CurrentTrackMaxCount");
  268.         g_pAVTransportService.UnregisterEvent("NumberOfTracks");
  269.         g_pAVTransportService.UnregisterEvent("PlayMode");
  270.     }
  271.     if (g_pVolumeService != null)
  272.     {
  273.         g_pVolumeService.UnregisterEvent("CurrentValue");
  274.     }
  275.     if (g_pMuteService != null)
  276.     {
  277.         g_pMuteService.UnregisterEvent("CurrentState");
  278.     }
  279.     // Get the current device object and its associated services
  280.     g_pCurrentDevice = pDevice;
  281.     try
  282.     {
  283.         g_pAVTransportService = g_pCurrentDevice.FindService("urn:upnp-org:serviceId:AVTransport");
  284.         g_pVolumeService = g_pCurrentDevice.FindService("urn:upnp-org:serviceId:Volume");
  285.         g_pConnectorService = g_pCurrentDevice.FindService("urn:upnp-org:serviceId:Connector");
  286.         g_pMuteService = g_pCurrentDevice.FindService("urn:upnp-org:serviceId:Mute");
  287.         // Register with each service to recieve notification of events we are interested in
  288.         g_pAVTransportService.RegisterEvent("TransportState", OnTransportStateChange);
  289.         g_pAVTransportService.RegisterEvent("RelativeTimePosition", OnRelativeTimePositionChange);
  290.         g_pAVTransportService.RegisterEvent("RelativeCounterPosition", OnRelativeCounterPositionChange);
  291.         g_pAVTransportService.RegisterEvent("CurrentTrackMaxCount", OnTrackMaxCountChange);
  292.         g_pAVTransportService.RegisterEvent("NumberOfTracks", OnNumberOfTracksChange);
  293.         g_pAVTransportService.RegisterEvent("PlayMode", OnPlayModeChange);
  294.         g_pVolumeService.RegisterEvent("CurrentValue", OnVolumeChange);
  295.         g_pMuteService.RegisterEvent("CurrentState", OnMuteChange);
  296.         // Determine current device's transport state
  297.         if (g_pAVTransportService != null)
  298.         {
  299.             var inArgs = new Array();
  300.             inArgs[0] = 0;                      // Set our default connection ID
  301.             var outArgs = new Array();  // unused
  302.             outArgs[0] = g_kTransportStateUnknown;
  303.             outArgs[1] = 0;
  304.             var outResults = new Array();       // unused
  305.             g_pAVTransportService.InvokeAction("GetTransportInfo", inArgs, outArgs, outResults);
  306.             OnTransportStateChange(g_pAVTransportService, outArgs[0]);
  307.         }
  308.     }
  309.     catch(error)
  310.     {
  311.         g_pAVTransportService = null;
  312.         g_pVolumeService = null;
  313.         g_pConnectorService = null;
  314.         g_pMuteService = null;
  315.         metadata.value="Error: Unable to connect to device"
  316.     }
  317.     SyncUIWithDevice();
  318. }
  319. //**********************************************************************
  320. // Abstract: SetupDefaultDevice() is called periodically to check if
  321. //           the default device has been set yet. If it hasn't then we
  322. //           will set it to the first device we find.
  323. //**********************************************************************
  324. function SetupDefaultDevice()
  325. {
  326.     if (g_pCurrentDevice == null)
  327.     {
  328.         remote.SyncDeviceList();
  329.         SelectDevice(remote.GetDevice(0));
  330.     }
  331. }
  332. //**********************************************************************
  333. // Abstract: Initialize() is called when the skin is first loaded. It
  334. //           will first tell our remote device to search for devices
  335. //           that expose the AVTransport service. We will then attempt
  336. //           to set our current device to the first device we find.
  337. //**********************************************************************
  338. function Initialize()
  339. {
  340.     remote.FindServiceProviders("urn:schemas-upnp-org:service:AVTransport:0.7");
  341.     remote.RegisterDeviceSwitch(OnDeviceSwitch);
  342. }
  343. //**********************************************************************
  344. function Play()
  345. {
  346.     if (g_pAVTransportService != null)
  347.     {
  348.         var inArgs = new Array();
  349.         inArgs[0] = 0;                  // Set our default connection ID
  350.         var outArgs = new Array();
  351.         var outResults = new Array();
  352.         for (var i = 0; i < 10; i++) outArgs[i] = 0; // HACK: We need to prepopulate our arrays
  353.         for (i = 0; i < 10; i++) outResults[i] = 0; // HACK: We need to prepopulate our arrays
  354.         g_pAVTransportService.InvokeAction("Play", inArgs, outArgs, outResults);
  355.         DisplayAVTransportError(outResults[0]);
  356.     }
  357. }
  358. //**********************************************************************
  359. function Pause()
  360. {
  361.     if (g_pAVTransportService != null)
  362.     {
  363.         var inArgs = new Array();
  364.         inArgs[0] = 0;          // Set our default connection ID
  365.         var outArgs = new Array();
  366.         var outResults = new Array();
  367.         for (var i = 0; i < 10; i++) outArgs[i] = 0; // HACK: We need to prepopulate our arrays
  368.         for (i = 0; i < 10; i++) outResults[i] = 0; // HACK: We need to prepopulate our arrays
  369.         g_pAVTransportService.InvokeAction("Pause", inArgs, outArgs, outResults);
  370.         DisplayAVTransportError(outResults[0]);
  371.     }
  372. }
  373. //**********************************************************************
  374. function Stop()
  375. {
  376.     if (g_pAVTransportService != null)
  377.     {
  378.         var inArgs = new Array();
  379.         inArgs[0] = 0;          // Set our default connection ID
  380.         var outArgs = new Array();
  381.         var outResults = new Array();
  382.         for (var i = 0; i < 10; i++) outArgs[i] = 0; // HACK: We need to prepopulate our arrays
  383.         for (i = 0; i < 10; i++) outResults[i] = 0; // HACK: We need to prepopulate our arrays
  384.         g_pAVTransportService.InvokeAction("Stop", inArgs, outArgs, outResults);
  385.         DisplayAVTransportError(outResults[0]);
  386.     }
  387. }
  388. //**********************************************************************
  389. function Previous()
  390. {
  391.     if (g_pAVTransportService != null)
  392.     {
  393.         // First determine what the current track is
  394.         var inArgs1 = new Array();
  395.         inArgs1[0] = 0;         // Set our default connection ID
  396.         var outArgs1 = new Array();
  397.         for (var i = 0; i < 10; i++) outArgs1[i] = 0; // HACK: We need to prepopulate our arrays
  398.         var outResults1 = new Array();
  399.         for (i = 0; i < 10; i++) outResults1[i] = 0; // HACK: We need to prepopulate our arrays
  400.         g_pAVTransportService.InvokeAction("GetPositionInfo", inArgs1, outArgs1, outResults1);
  401.         var previousTrack = outArgs1[0] - 1;
  402.         if (previousTrack <= 0)
  403.         {
  404.             previousTrack = g_iNumberTracks;
  405.         }
  406.         var inArgs2 = new Array();
  407.         inArgs2[0] = 0;         // Set our default connection ID
  408.         inArgs2[1] = "TRACK_NR";                // Indicate we want to move to a specific track
  409.         // Convert integer to a string, and then convert string into a BSTR (JScript is brain-damaged!)
  410.         inArgs2[2] = previousTrack.toString();
  411.         var outArgs2 = new Array();
  412.         for (i = 0; i < 10; i++) outArgs2[i] = 0; // HACK: We need to prepopulate our arrays
  413.         var outResults2 = new Array();
  414.         for (i = 0; i < 10; i++) outResults2[i] = 0; // HACK: We need to prepopulate our arrays
  415.         g_pAVTransportService.InvokeAction("Seek", inArgs2, outArgs2, outResults2);
  416.         DisplayAVTransportError(outResults2[0]);
  417.     }
  418. }
  419. //**********************************************************************
  420. function Next()
  421. {
  422.     if (g_pAVTransportService != null)
  423.     {
  424.         // First determine what the current track is
  425.         var inArgs1 = new Array();
  426.         inArgs1[0] = 0;         // Set our default connection ID
  427.         var outArgs1 = new Array();
  428.         for (var i = 0; i < 10; i++) outArgs1[i] = 0; // HACK: We need to prepopulate our arrays
  429.         var outResults1 = new Array();
  430.         for (i = 0; i < 10; i++) outResults1[i] = 0; // HACK: We need to prepopulate our arrays
  431.         g_pAVTransportService.InvokeAction("GetPositionInfo", inArgs1, outArgs1, outResults1);
  432.         var nextTrack = outArgs1[0] + 1;
  433.         if (nextTrack > g_iNumberTracks)
  434.         {
  435.             nextTrack = 1;
  436.         }
  437.         var inArgs2 = new Array();
  438.         inArgs2[0] = 0;         // Set our default connection ID
  439.         inArgs2[1] = "TRACK_NR";                // Indicate we want to move to a specific track
  440.         inArgs2[2] = nextTrack.toString();
  441.         var outArgs2 = new Array();
  442.         for (i = 0; i < 10; i++) outArgs2[i] = 0; // HACK: We need to prepopulate our arrays
  443.         var outResults2 = new Array();
  444.         for (i = 0; i < 10; i++) outResults2[i] = 0; // HACK: We need to prepopulate our arrays
  445.         g_pAVTransportService.InvokeAction("Seek", inArgs2, outArgs2, outResults2);
  446.         DisplayAVTransportError(outResults2[0]);
  447.     }
  448. }
  449. //**********************************************************************
  450. function SetPosition(iPosition)
  451. {
  452.     if (g_pAVTransportService != null && !g_fSettingSeek)
  453.     {
  454.         // First determine what the current track is
  455.         var inArgs1 = new Array();
  456.         inArgs1[0] = 0;         // Set our default connection ID
  457.         inArgs1[1] = "ABS_COUNT";
  458.         inArgs1[2] = (iPosition * g_iMaxCount) / 100;
  459.         var outArgs1 = new Array();
  460.         var outResults1 = new Array();
  461.         for (var i = 0; i < 10; i++) outArgs1[i] = 0; // HACK: We need to prepopulate our arrays
  462.         for (i = 0; i < 10; i++) outResults1[i] = 0; // HACK: We need to prepopulate our arrays
  463.         g_fSettingSeek = true;
  464.         g_pAVTransportService.InvokeAction("Seek", inArgs1, outArgs1, outResults1);
  465.         DisplayAVTransportError(outResults1[0]);
  466.         g_fSettingSeek = false;
  467.     }
  468. }
  469. //**********************************************************************
  470. function FastReverse(fStart)
  471. {
  472.     if (g_pAVTransportService != null)
  473.     {
  474.         // First determine what the current track is
  475.         var inArgs1 = new Array();
  476.         inArgs1[0] = 0;         // Set our default connection ID
  477.         inArgs1[1] = (fStart) ? -20 : 10;
  478.         var outArgs1 = new Array();
  479.         var outResults1 = new Array();
  480.         for(var i=0; i<10;i++)outArgs1[i] = 0;
  481.         for(var i=0; i<10;i++)outResults1[i] = 0;
  482.         g_pAVTransportService.InvokeAction("Scan", inArgs1, outArgs1, outResults1);
  483.     if (outResults1[0] != 0)
  484.     {
  485.         rew.down = false;
  486.             DisplayAVTransportError(outResults1[0]);
  487.     }
  488.     }
  489. }
  490. //**********************************************************************
  491. function FastForward(fStart)
  492. {
  493.     if (g_pAVTransportService != null)
  494.     {
  495.         // First determine what the current track is
  496.         var inArgs1 = new Array();
  497.         inArgs1[0] = 0;         // Set our default connection ID
  498.         inArgs1[1] = (fStart) ? 20 : 10;
  499.         var outArgs1 = new Array();
  500.         var outResults1 = new Array();
  501.         for(var i=0; i<10;i++)outArgs1[i] = 0;
  502.         for(var i=0; i<10;i++)outResults1[i] = 0;
  503.         g_pAVTransportService.InvokeAction("Scan", inArgs1, outArgs1, outResults1);
  504.     if (outResults1[0] != 0)
  505.     {
  506.         ffwd.down = false;
  507.             DisplayAVTransportError(outResults1[0]);
  508.     }
  509.     }
  510. }
  511. //**********************************************************************
  512. function MuteDevice(fMuted)
  513. {
  514.     if (g_pMuteService != null)
  515.     {
  516.         var inArgs = new Array();
  517.         var outArgs = new Array();
  518.         var outResults = new Array();
  519.         g_pMuteService.InvokeAction((fMuted) ? "SetOn" : "SetOff", inArgs, outArgs, outResults);
  520.     }
  521. }
  522. //**********************************************************************
  523. function SetVolume(iVolume)
  524. {
  525.     if (g_fSettingVolume)
  526.     {
  527.         return;
  528.     }
  529.     g_fSettingVolume = true;
  530.     if (g_pVolumeService != null)
  531.     {
  532.         var inArgs = new Array();
  533.         inArgs[0] = iVolume;
  534.         var outArgs = new Array();
  535.         var outResults = new Array();
  536.         g_pVolumeService.InvokeAction("SetCurrentPercent", inArgs, outArgs, outResults);
  537.     }
  538.     g_fSettingVolume = false;
  539. }
  540. //**********************************************************************
  541. function SetShuffle(fShuffleOn)
  542. {
  543.     if (g_fSettingShuffle)
  544.     {
  545.         return;
  546.     }
  547.     g_fSettingShuffle = true;
  548.     if (g_pAVTransportService != null)
  549.     {
  550.         var inArgs = new Array();
  551.         inArgs[0] = 0;
  552.         inArgs[1] = (fShuffleOn) ? "SHUFFLE" : "NORMAL";
  553.         var outArgs = new Array();
  554.         var outResults = new Array();
  555.         for (var i = 0; i < 10; i++) outArgs[i] = 0; // HACK: We need to prepopulate our arrays
  556.         for (i = 0; i < 10; i++) outResults[i] = 0; // HACK: We need to prepopulate our arrays
  557.         g_pAVTransportService.InvokeAction("SetPlayMode", inArgs, outArgs, outResults);
  558.         DisplayAVTransportError(outResults[0]);
  559.     }
  560.     g_fSettingShuffle = false;
  561. }
  562. //**********************************************************************
  563. function SetRepeat(fRepeatOn)
  564. {
  565.     if (g_fSettingRepeat)
  566.     {
  567.         return;
  568.     }
  569.     g_fSettingRepeat = true;
  570.     if (g_pAVTransportService != null)
  571.     {
  572.         var inArgs = new Array();
  573.         inArgs[0] = 0;
  574.         inArgs[1] = (fRepeatOn) ? "REPEAT_ALL" : "NORMAL";
  575.         var outArgs = new Array();
  576.         var outResults = new Array();
  577.         for (var i = 0; i < 10; i++) outArgs[i] = 0; // HACK: We need to prepopulate our arrays
  578.         for (i = 0; i < 10; i++) outResults[i] = 0; // HACK: We need to prepopulate our arrays
  579.         g_pAVTransportService.InvokeAction("SetPlayMode", inArgs, outArgs, outResults);
  580.         DisplayAVTransportError(outResults[0]);
  581.     }
  582.     g_fSettingRepeat = false;
  583. }
  584. //**********************************************************************
  585. function PopulateDeviceDropDown()
  586. {
  587.     ViewSelectPopup.deleteAll();
  588.     remote.SyncDeviceList();
  589.     for (var i = 0; i < remote.numberDevices; i++)
  590.     {
  591.         ViewSelectPopup.appendItem(remote.GetDevice(i).FriendlyName());
  592.     } 
  593. }