OSSL Script Library/OpenSim Radio

From OpenSimulator

(Difference between revisions)
Jump to: navigation, search
(My first contribution to the script library....)
 
m (Robot: Replacing 'OpenSim' to 'OpenSimulator', which is the precise name)
 
(3 intermediate revisions by 2 users not shown)
Line 4: Line 4:
 
* Very basic, and much could be added or improved.
 
* Very basic, and much could be added or improved.
 
* Demonstrates the use of OSSL functions to read a notecard.
 
* Demonstrates the use of OSSL functions to read a notecard.
 +
 +
'''Updates'''
 +
* 0.12 - Selected station choice is now saved in the object description, and will be re-applied to the land/parcel upon script stert.
 +
* 0.11 - Improved menu system
 +
* 0.10 - Initial version
  
 
=== Notecard ===
 
=== Notecard ===
Line 16: Line 21:
 
More stations can be found at http://www.shoutcast.com
 
More stations can be found at http://www.shoutcast.com
  
=== OpenSim Radio ===
+
=== OpenSimulator Radio ===
 
<source lang = "lsl">
 
<source lang = "lsl">
 
// ######################################
 
// ######################################
 
// Radio for OpenSim, by Fritigern Gothly
 
// Radio for OpenSim, by Fritigern Gothly
// Version 0.1 - Sept 5, 2011
+
// Version 0.12 - Oct 08, 2011
// --------------------------------------
+
//
 
// Add your name and date to these
 
// Add your name and date to these
 
// comments if you alter this script in
 
// comments if you alter this script in
Line 46: Line 51:
 
initialize()
 
initialize()
 
{
 
{
 +
    //Clear the values to prevent problems
 +
    names =[];
 +
    uris=[];
 +
    page = [];
 +
    pagenum=0;
 +
    cardlines=0;
 +
    // Now get all stations (again)
 
     cardlines = osGetNumberOfNotecardLines(stationcard);
 
     cardlines = osGetNumberOfNotecardLines(stationcard);
 
     for(n=0;n<cardlines;++n)
 
     for(n=0;n<cardlines;++n)
Line 52: Line 64:
 
             // string. Makes this script a little more forgiving.
 
             // string. Makes this script a little more forgiving.
 
         string line = llStringTrim(osGetNotecardLine(stationcard,n), STRING_TRIM);
 
         string line = llStringTrim(osGetNotecardLine(stationcard,n), STRING_TRIM);
         integer seperator = llSubStringIndex(line, "=");
+
         if(llGetSubString(line,0,0)=="#" || line == "")
        uris += [llStringTrim(llGetSubString(line,seperator+1,llStringLength(line)), STRING_TRIM)];
+
        {
       
+
            // Skip comments and empty lines
            // Make sure that the button names fit on the buttons. Names  
+
        } else {
            // can be up to 24 characters (but only a few will show),
+
            integer seperator = llSubStringIndex(line, "=");
            // Doing this will let you put really long station names in
+
            uris += [llStringTrim(llGetSubString(line,seperator+1,llStringLength(line)), STRING_TRIM)];
            // the notecard without problems.
+
           
        string desc = llStringTrim(llGetSubString(line,0,seperator-1), STRING_TRIM);
+
                // Make sure that the button names fit on the buttons. Names  
        if(llStringLength(desc) >= 23) desc = llGetSubString(desc,0,23);
+
                // can be up to 24 characters (but only a few will show),
        names += [desc];      
+
                // Doing this will let you put really long station names in
 +
                // the notecard without problems.
 +
            string desc = llStringTrim(llGetSubString(line,0,seperator-1), STRING_TRIM);
 +
            if(llStringLength(desc) >= 23) desc = llGetSubString(desc,0,23);
 +
            names += [desc];
 +
        }
 
     }
 
     }
 
      
 
      
Line 78: Line 95:
 
         btn="";
 
         btn="";
 
     }
 
     }
 +
    llOwnerSay("Notecard loaded. "+(string)llGetListLength(names)+" stations in "+llGetListLength(page)+" pages.");
 
}
 
}
  
Line 84: Line 102:
 
{
 
{
 
     list b = ["< Prev","Cancel","Next >"]+llParseString2List(buttons,",","");
 
     list b = ["< Prev","Cancel","Next >"]+llParseString2List(buttons,",","");
     llDialog(toucher, "\nChoose a station:", b, dchannel);
+
    string txt = "\nShowing stations "+(string)((pagenum*9)+1)+" to "+(string)((pagenum*9)+llGetListLength(llParseString2List(buttons,",","")))+
 +
                " of "+(string)llGetListLength(names)+" loaded.\n"+
 +
                "\nPage "+(string)(pagenum+1)+" of "+(string)llGetListLength(page);
 +
     llDialog(toucher, txt+"\nChoose a station:", b, dchannel);
 
     b=[]; // Clear the list, and save some memory.
 
     b=[]; // Clear the list, and save some memory.
 
}
 
}
Line 93: Line 114:
 
     {
 
     {
 
         dchannel = llFloor(llFrand(9999999)); // Choose a random channel.
 
         dchannel = llFloor(llFrand(9999999)); // Choose a random channel.
        llSetText("OpenSim Radio\nClick to choose a station", <1,1,1>,1);
 
 
         initialize();
 
         initialize();
 +
        if(llGetObjectDesc() != (integer)llGetObjectDesc()||llGetObjectDesc() == "")
 +
        {
 +
            llSetText("OpenSimulator Radio\nClick to choose a station", <1,1,1>,1);
 +
        } else {
 +
            integer index = (integer)llGetObjectDesc();
 +
            llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1);
 +
            llSetParcelMusicURL(llList2String(uris,index)); // Sometimes the parcel's audio settings don't survive a restart or server upgrade. So we'll set it again, just to make sure.
 +
        }
 +
        // llOwnerSay("Ready");
 
     }
 
     }
 
      
 
      
Line 128: Line 157:
 
             integer index = llListFindList(names,msg);
 
             integer index = llListFindList(names,msg);
 
             llSetParcelMusicURL(llList2String(uris,index));
 
             llSetParcelMusicURL(llList2String(uris,index));
 +
            llSay(0,"Station changed to "+llList2String(names,index)+" ("+llList2String(uris,index)+")");
 
             llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1);
 
             llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1);
 +
            llSetObjectDesc((string)index);
 
         }
 
         }
 
     }
 
     }
Line 137: Line 168:
 
         if(ischanged & CHANGED_INVENTORY) initialize();
 
         if(ischanged & CHANGED_INVENTORY) initialize();
 
     }
 
     }
}
+
}</source>
</source>
+
 
+
  
 
[[Category:Scripts]]
 
[[Category:Scripts]]

Latest revision as of 23:48, 3 March 2012

A basic parcel radio, using OSSL functions to read a notecard, cointaining a list of stations.

  • Open access, so anyone can change stations.
  • Very basic, and much could be added or improved.
  • Demonstrates the use of OSSL functions to read a notecard.

Updates

  • 0.12 - Selected station choice is now saved in the object description, and will be re-applied to the land/parcel upon script stert.
  • 0.11 - Improved menu system
  • 0.10 - Initial version

[edit] Notecard

Name the notecard "stations" and place it in your prim. Here are some example stations, copy and pase these exatly into your notecard:

Public Domain Jazz=http://82.197.167.138:80
Digital Gunfire=http://radio1-uk.digitalgunfire.com:8000
Salsa and Latin=http://205.188.215.231:8010
Retro=http://scfire-ntc-aa03.stream.aol.com:80/stream/1013

More stations can be found at http://www.shoutcast.com

[edit] OpenSimulator Radio

// ######################################
// Radio for OpenSim, by Fritigern Gothly
// Version 0.12 - Oct 08, 2011
//
// Add your name and date to these
// comments if you alter this script in
// any way.
// If you put this in your own build, 
// make sure to mention BOTH me and you!
// ######################################
 
integer dchannel; // Will be a random number.
key toucher;
string stationcard = "stations"; // Name for the notecard. Change this is you want to use a different name.
integer cardlines;
integer n;
integer i;
list names;
list uris;
list page;
integer pagenum;
 
// ----------------------
// Needed user functions.
// ----------------------
 
initialize()
{
    //Clear the values to prevent problems
    names =[];
    uris=[];
    page = [];
    pagenum=0;
    cardlines=0;
    // Now get all stations (again)
    cardlines = osGetNumberOfNotecardLines(stationcard);
    for(n=0;n<cardlines;++n)
    {
            // Use llStringTrim to get rid of additional spaces around the
            // string. Makes this script a little more forgiving.
        string line = llStringTrim(osGetNotecardLine(stationcard,n), STRING_TRIM);
        if(llGetSubString(line,0,0)=="#" || line == "")
        {
            // Skip comments and empty lines
        } else {
            integer seperator = llSubStringIndex(line, "=");
            uris += [llStringTrim(llGetSubString(line,seperator+1,llStringLength(line)), STRING_TRIM)];
 
                // Make sure that the button names fit on the buttons. Names 
                // can be up to 24 characters (but only a few will show),
                // Doing this will let you put really long station names in
                // the notecard without problems.
            string desc = llStringTrim(llGetSubString(line,0,seperator-1), STRING_TRIM);
            if(llStringLength(desc) >= 23) desc = llGetSubString(desc,0,23);
            names += [desc];
        }
    }
 
 
        // Get all entries from the list of station names and put them in a string
        // in groups of nine, and put them in a new list..
    string btn;
    for(n=0;n<llGetListLength(names);n=n+9)
    {
        for(i=n;i<(n+9);++i) // Get 9 buttons....
        {
            if(n>llGetListLength(names)) return;
            btn += llList2String(names,i)+",";
        }
        page += [btn]; // ...And put them in a list again! (As a string, not as list items!)
        btn="";
    }
    llOwnerSay("Notecard loaded. "+(string)llGetListLength(names)+" stations in "+llGetListLength(page)+" pages.");
}
 
 
dialog(string buttons)
{
    list b = ["< Prev","Cancel","Next >"]+llParseString2List(buttons,",","");
    string txt = "\nShowing stations "+(string)((pagenum*9)+1)+" to "+(string)((pagenum*9)+llGetListLength(llParseString2List(buttons,",","")))+
                 " of "+(string)llGetListLength(names)+" loaded.\n"+
                 "\nPage "+(string)(pagenum+1)+" of "+(string)llGetListLength(page);
    llDialog(toucher, txt+"\nChoose a station:", b, dchannel);
    b=[]; // Clear the list, and save some memory.
}
 
default
{
    state_entry()
    {
        dchannel = llFloor(llFrand(9999999)); // Choose a random channel.
        initialize();
        if(llGetObjectDesc() != (integer)llGetObjectDesc()||llGetObjectDesc() == "")
        {
            llSetText("OpenSimulator Radio\nClick to choose a station", <1,1,1>,1);
        } else {
            integer index = (integer)llGetObjectDesc();
            llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1);
            llSetParcelMusicURL(llList2String(uris,index)); // Sometimes the parcel's audio settings don't survive a restart or server upgrade. So we'll set it again, just to make sure.
        }
        // llOwnerSay("Ready");
    }
 
    touch_start(integer numdet)
    {
        toucher = llDetectedKey(0);
        llListen(dchannel, "","","");
        dialog(llList2String(page,pagenum));
 
    }
 
    listen(integer channel, string name, key id, string msg)
    {
        if(msg == "< Prev")
        {
            --pagenum;
            if(pagenum<0) pagenum = llGetListLength(page)-1;
            dialog(llList2String(page,pagenum));
        } 
        else if(msg == "Next >")
        {
            ++pagenum;
            if(pagenum>=llGetListLength(page)) pagenum = 0;
            dialog(llList2String(page,pagenum));
        } 
        else if(msg == "Cancel")
        {
            pagenum = 0;
            return;
        } 
        else {
                // If none of the predefined buttons were clicked, it must be a station name.
            integer index = llListFindList(names,msg);
            llSetParcelMusicURL(llList2String(uris,index));
            llSay(0,"Station changed to "+llList2String(names,index)+" ("+llList2String(uris,index)+")");
            llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1);
            llSetObjectDesc((string)index);
        }
    }
 
    changed(integer ischanged)
    {
            //If something changed in the inventory, go and read the list with stations again!
        if(ischanged & CHANGED_INVENTORY) initialize();
    }
}
Personal tools
General
About This Wiki